通常、コントロールには「背景の色」、「表示文字の色」を設定できます。
ここでは、これらの設定方法の概要を示します。
【使用関数】
CWnd::OnCtlColor
上記関数は、ClassWizardでWM_CTLCOLORメッセージを設定することにより生成出来ます。
【書式】
HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UNIT nCtrlColor);
戻り値 :背景色
pDC :子ウィンドウのディスプレイコンテキスト
pWnd :該当するコントロールへのポインタ
nCtrlColor :コントロールのタイプを指定
| nCtrlColorの値 |
| CTLCOLOR_BTN | ボタン |
| CTLCOLOR_DLG | ダイアログボックス |
| CTLCOLOR_EDIT | エディットボックス |
| CTLCOLOR_LISTBOX | リストボックス |
| CTLCOLOR_MSGBOX | メッセージボックス |
| CTLCOLOR_SCROLLBAR | スクロールバー |
| CTLCOLOR_STATIC | スタティックテキスト |
[文字色の設定]
OnCtlColor関数の中で文字色を指定するときは、次の関数を使用します。
pDC->SetBkMode(TRANSPARENT); //背景が見えるようにする
pDC->SetTextColor(RGB(255,0,0)); //文字色を指定 例:赤
OnCtlColor関数を使って、エディットボックスの背景を緑、文字を赤、
リストボックスの背景を青にするときは、以下のように記述します。
if(nCtlColor == CTLCOLOR_EDIT){
pDC->SetBkMode(TRANSPARENT); //背景を見えるようにする
pDC->SetTextColor((RGB(255,0,0)); //文字を赤にする
return::CreateSoliBrush(RGB(0,255,0)); //背景を緑にする
}
else if(nCtlColor == CTLCOLOR_LISTBOX){
return::CreateSoliBrush(RGB(0,0,255)); //背景を青にする
}
【コントロールの識別】
OnCtlColor関数によりコントロールのタイプを調べるには、nCtlColor引数を
調べることにより知ることが出来ます。しかし、この方法には以下のような問題
があります。
・同種のコントロールは、nCtlColor引数が同じになる。
すなわち、同種のコントロールが複数ある場合は、それらの判別が出来ないという
ことになります。従って、この方法は同種の複数コントロールに別々の色を設定
することが出来ません。
これを可能にするためにコントロールにメンバ変数を割り当てます。
この操作はClassWizardで簡単に設定することが可能です。こうして設定したメンバ変数
とpWnd引数を使用することによりこの問題を解決することが出来ます。
では、以下にエディットボックスを使用した簡単な例を示します。
二つのエディットボックスにそれぞれ以下のコントロールメンバ変数を割り当てます。
m_edit1
m_edit2
if(nCtlColor == CTLCOLOR_EDIT){
pDC->SetBkMode(TRANSPARENT);
if(pWnd == &m_edit1){ //m_edit1かどうかの判定
pDC->SetTextColor(RGB(255,0,0)); //赤
return ::CreateSolidBrush(RGB(0,255,0)); //緑
}
else if(pWnd == &m_edit2){ //m_edit2かどうかの判定
pDC->SetTextColor(RGB(255,2550)); //黄
return ::CreateSolidBrush(RGB(0,0,255)); //青
}
}