MFC 色選択ができるComboBox
○VC6の方法--------------------------------------------------------
@フォームにコンボボックスを貼り付けます
グラフィックエディタのコンボボックスコントロールの絵の▼をクリックします。
すると枠が現れます。この枠を下方向に引っ張って垂れ具合を調整します
Aプロパティーを設定
CTRL+Enterにて改行が入ります。
Bクラスの新規作成
C作ったクラスをダイアログに取り込みます。
#include "ColorComboBox.h"
DダイアログのOnInitDialog()にてサブクラス化します。
// TODO: 特別な初期化を行う時はこの場所に追加してください。
CColorComboBox* pCCombo = new CColorComboBox();
pCCombo->SubclassDlgItem(IDC_COMBO1,this);
EColorComboBox.cppを開いて
クラスウィザードにてイベントを追加
WM_CTLCOLOR
WM_DRAWITEM
Fこの文章の下のほうにある ○イベントの内容 のように書き換えます
○VC.net2002の方法------------------------------------------------------
@フォームにコンボボックスを貼り付けます
グラフィックエディタのコンボボックスコントロールの絵の▼をクリックします。
すると枠が現れます。この枠を下方向に引っ張って垂れ具合を調整します。
AComboBoxのプロパティーにて設定変更
Owner Drow : 固定
Has Strings : True
Data : aa;bb;cc;dd;ee
Bクラスの追加
MFCクラスのCComboBoxを基本としたクラスを追加
#include "ColorComboBox.h"を追加
Cコントロールのサブクラス化
CColorComboBox* pCCombo = new CColorComboBox();
pCCombo->SubclassDlgItem(IDC_COMBO1,this);
Dイベントの追加
CColorComboBox.hを開き、
WM_CTLCOLOR
WM_DRAWITEM
を追加します。
E追加されたイベントを以下のように編集します。
○イベントの内容------------------------------------------------------
CBrush*pBrush;//説明を簡単にするためにとりあえずグローバルで宣言
COLORREF color;
void CColorComboBox::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC;
pDC = CDC::FromHandle( lpDrawItemStruct->hDC);
CRect rc( lpDrawItemStruct->rcItem);
//アイテムの色を指定
if(lpDrawItemStruct->itemID==0) color=RGB(255,0,0);
if(lpDrawItemStruct->itemID==1) color=RGB(0,255,0);
if(lpDrawItemStruct->itemID==2) color=RGB(0,0,255);
if(lpDrawItemStruct->itemID==3) color=RGB(255,0,255);
delete pBrush;
pBrush=new CBrush(color);
pDC->FillRect( rc, pBrush);
pDC->SetTextColor(RGB(255,255,255));//テキストの色
pDC->SetBkMode(TRANSPARENT);//「テキストが書かれている部分」の背景色を透明なブラシで塗る
//テキストを書く
CString str;
this->GetLBText( lpDrawItemStruct->itemID, str);
//pDC->DrawText( str, &lpDrawItemStruct->rcItem,DT_CENTER);//センターに文字を書くとき
pDC->DrawText( str, &lpDrawItemStruct->rcItem,DT_LEFT);
}
HBRUSH CColorComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
switch (nCtlColor) {
case CTLCOLOR_EDIT: //エディット コントロール
pDC->SetBkMode(TRANSPARENT);//「テキストが書かれている部分」の背景色を透明なブラシで塗る
pDC->SelectObject(pBrush);
GetDlgItem(1001)->PostMessage(EM_SETSEL,0,0);//全選択状態だとかっこ悪いため
//もしくは他のコントロールにフォーカスを移動させたほうがいいかもしれません。
return (HBRUSH)pBrush;
default:
return hbr;
}
}
▲トップページ
>
Windows と C++