|
エディットボックスの色変更
今回はエディットボックスの文字色の変更方法です。作るものは「色選択ダイアログ」で作ったものとほぼ同じです。
では、さっそくプロジェクトを作成し、次のようなダイアログを作ります。

"色選択"ボタンが押されると、色選択ダイアログを表示し、エディットボックスの文字列を、指定した色で描画します。
ボタンにはBN_CLICKEDのメッセージハンドラを追加します。(「ボタンの基本」等を見てください。)
エディットボックスはウィンドウとして扱うので、コントロール型のDDX変数を追加しておきましょう。

色情報はCOLORREF型の変数で扱います。ここではダイアログのメンバ変数に保持します。

では、コードを実装していきましょう。まずは、コンストラクタで色情報の初期値を入れておきます。
// コンストラクタ
CColorSelectDlg::CColorSelectDlg(CWnd* pParent /*=NULL*/)
: CDialog(CColorSelectDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_color = RGB(255, 0, 0);
} |
コントロールが描画されるときは、親ウィンドウにWM_CTLCOLORメッセージが送られます。このメッセージが送られたときに、エディットボックスの色を変更します。
ダイアログクラスのプロパティからメッセージアイコンをクリックし、WM_CTLCOLORを選択し、CWnd::OnCtlColor()関数をオーバーライドします。

OnCtlColor()関数では、次のようにエディットボックスの色変更処理を追加します。
HBRUSH CColorSelectDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// エディットボックスの色変更
if (nCtlColor == CTLCOLOR_EDIT)
if (*pWnd == m_xcEditColor)
{
// 文字色
pDC->SetTextColor(m_color);
// 背景色
hbr = static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
pDC->SetBkColor(RGB(0, 0, 0));
}
return hbr;
} |
OnCtlColor()関数の第2引数は、描画されようとしているコントロールのポインタ、第3引数はコントロールの種類が渡されます。文字色の変更は、CDC::SetTextColor()関数を使います。
背景色の変更は、hbrに設定したい色のブラシをセットし、さらにCDC::SetBkColor()関数を実行します。ここではストックオブジェクトを使っていますが、独自の色を設定したい場合は、独自のブラシを作成します。
もしhbrにブラシをセットしないと、次のようになってしまいます。文字領域以外の背景部分が白いままになってしまいます。

次は"色選択"ボタンが押されたときのイベントハンドラです。
// "色選択"ボタン押下
void CColorSelectDlg::OnBnClickedColorSel()
{
CColorDialog CColorDialog(m_color);
int err = 0;
// 色選択ダイアログ表示
if (CColorDialog.DoModal() == IDOK)
{
// 選択された色を取得
m_color = CColorDialog.GetColor();
// 表示更新
Invalidate();
}
return;
} |
色選択のダイアログは、CColorDialogクラスを使います。コンストラクタにCOLORREF型の変数を渡すと、初期状態でその色が選択された状態になります。
選択された色を取得するには、CColorDialog::GetColor()関数を使います。選択された色でエディットボックスを更新するために、CWnd::Invalidate()関数を1度呼び出します。こうするとWM_CTLCOLORメッセージが発行されます。
では、ビルドして実行してみましょう。色選択ダイアログで任意の色を選択すると、エディットボックスの文字色が変わります。



|