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++