• 締切済み

CCheckListBoxの背景色

はじめまして。 VC6.0 WXP-SP2でアプリを作成しているのですが、CCheckListBoxの箱の背景色を簡単に変更することで、CCheckListBoxを所有するダイアログにOnCtlColor()のイベント処理を追加しました。 ここで背景色を希望色にしているのですが、CCheckListBoxに文字列があるところは文字色も背景色も変更できません。 文字列の色と背景色を変更する方法はありますでしょうか? どなたかご教授下さい。

みんなの回答

回答No.2

 すんません、訂正と追加です。  どちらにしろ、ダイアログの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; }

mahtaihen
質問者

お礼

こんにちは。 ご回答有難う御座いました。 早速実装してみたのですが、選択した項目のチェックボックスが 消えてしまうのですが、表示する方法は御座いますでしょうか? ご教授宜しくお願い致します。

回答No.1

 こんばんは。  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); }

mahtaihen
質問者

お礼

遅くなっていまいましたが、ご教授有難う御座います。 ご教授頂いた内容を実装するのが年明けになってしまいますが、 大変感謝しています。 有難う御座いました。