- 締切済み
CCheckListBoxの背景色
はじめまして。 VC6.0 WXP-SP2でアプリを作成しているのですが、CCheckListBoxの箱の背景色を簡単に変更することで、CCheckListBoxを所有するダイアログにOnCtlColor()のイベント処理を追加しました。 ここで背景色を希望色にしているのですが、CCheckListBoxに文字列があるところは文字色も背景色も変更できません。 文字列の色と背景色を変更する方法はありますでしょうか? どなたかご教授下さい。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
すんません、訂正と追加です。 どちらにしろ、ダイアログのOnCtlColor()はアイテム外の領域を塗る為に必要なので、CMyCheckListBox内でブラシを作成し、CMyCheckListBox::DrawItem()側とダイアログのOnCtlColor()側で共有した方が良いです。 //CMyCheckListBoxヘッダ側 class CMyCheckListBox : public CCheckListBox { //以上省略 HBRUSH GetBrush() const;//追加 private: CBrush m_brush;//追加 //以下省略 }; //CMyCheckListBoxソース側 //コンストラクタ CMyCheckListBox::CMyCheckListBox() { //ブラシを作成しておく(追加) m_brush.CreateSolidBrush(RGB(255, 255, 224)); } //ブラシを取り出す(追加) HBRUSH CMyCheckListBox::GetBrush() const { return m_brush; } //ココでアイテムや文字を描く void CMyCheckListBox::DrawItem(LPDRAWITEMSTRUCT lpdis) { //以上省略 ×//クリーム色のブラシを作る ×CBrush brush; ×brush.CreateSolidBrush(RGB(255, 255, 224)); ○//アイテムをクリーム色に塗る(メンバを使う) ○pDC->FillRect(&lpdis->rcItem, &m_brush); //以下省略 } //ダイアログソース側 HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: この位置で DC のアトリビュートを変更してください // TODO: デフォルトのブラシが望みのものでない場合には、違うブラシを返してください //m_checkListBoxのブラシを渡す if(pWnd == &m_checkListBox || nCtlColor == CTLCOLOR_LISTBOX) hbr = m_checkListBox.GetBrush(); return hbr; }
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 OnCtlColor()は、アイテム外の部分に着色されるだけなのでは。 「似た様な事例」 http://oshiete1.goo.ne.jp/qa4481456.html アイテムに着色するのであるならば、 void CCheckListBox::DrawItem(LPDRAWITEMSTRUCT lpdis) をオーバーライドしないと達成出来ないと思います。 「CCheckListBoxのメンバ」 http://msdn.microsoft.com/ja-jp/library/zkbas857(VS.80).aspx CCheckListBoxから派生クラスを作成しなければいけません。 しかしVC60でCCheckListBoxの派生クラスをクラスウィザードから追加出来ない様で・・・。手書きで追加するしか手立てが無いみたいです。 当然、オーバーライドしたクラスの方を、ダイアログ内で使用します。 以下参考程度に。 //ヘッダ側 class CMyCheckListBox : public CCheckListBox { DECLARE_DYNAMIC(CMyCheckListBox) public: CMyCheckListBox(); // 生成されたメッセージ マップ関数 //{{AFX_MSG(CMyCheckListBox) afx_msg void DrawItem(LPDRAWITEMSTRUCT); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //ソース側 IMPLEMENT_DYNAMIC(CMyCheckListBox, CCheckListBox) BEGIN_MESSAGE_MAP(CMyCheckListBox, CCheckListBox) //{{AFX_MSG_MAP(CMyCheckListBox) ON_WM_DRAWITEM() //}}AFX_MSG_MAP END_MESSAGE_MAP() //コンストラクタ CMyCheckListBox::CMyCheckListBox() { } //ココでアイテムや文字を描く void CMyCheckListBox::DrawItem(LPDRAWITEMSTRUCT lpdis) { //アイテム名を取る CString strItem; this->GetText(lpdis->itemID, strItem); //クリーム色のブラシを作る CBrush brush; brush.CreateSolidBrush(RGB(255, 255, 224)); CDC* pDC = CDC::FromHandle(lpdis->hDC); //アイテムをクリーム色に塗る pDC->FillRect(&lpdis->rcItem, &brush); //文字の背景色を透明にする pDC->SetBkMode(TRANSPARENT); //文字の色をパステルグリーンにする pDC->SetTextColor(RGB(128, 255, 96)); //文字をアイテムに描く pDC->DrawText(strItem, &lpdis->rcItem, DT_VCENTER | DT_CENTER | DT_SINGLELINE); //選択されているので、アイテムの色彩を反転する if(lpdis->itemState & ODS_SELECTED) ::InvertRect(*pDC, &lpdis->rcItem); //フォーカスを持っているので、フォーカス矩形を描く if(lpdis->itemState & ODS_FOCUS) ::DrawFocusRect(*pDC, &lpdis->rcItem); }
お礼
遅くなっていまいましたが、ご教授有難う御座います。 ご教授頂いた内容を実装するのが年明けになってしまいますが、 大変感謝しています。 有難う御座いました。
お礼
こんにちは。 ご回答有難う御座いました。 早速実装してみたのですが、選択した項目のチェックボックスが 消えてしまうのですが、表示する方法は御座いますでしょうか? ご教授宜しくお願い致します。