Last Updated 2003/04/02
Programming Tips Visual C++ MFC ダイアログ  索 引 
スタティックコントロール色の変更
2003/04/02

ダイアログのスタティックテキストの色を変更するには,WM_CTLCOLORSTATIC のメッセージにて SetTextColor() にて変更する.


case WM_CTLCOLORSTATIC :
    i = GetWindowLong( (HWND)lParam, GWL_ID );
    if ( i == IDC_STATIC1 ) {
        SetTextColor( (HDC)wParam, RGB( 255, 0, 0 ) );
        SetBkColor( (HDC)wParam, GetSysColor( COLOR_3DFACE ) );
        return (BOOL)GetStockObject( NULL_BRUSH );
    }
    break;


背景色を変えたい場合は,WM_CTLCOLORSTATIC が来たときの戻り値にブラシハンドルを返す.
  背景色を白くする
    case WM_CTLCOLORSTATIC :
        return( ( LRESULT )GetStockObject( WHITE_BRUSH ) );

(ちなみに,WM_CTLCOLOR は Windows3.1 時代のメッセージ)

WM_CTLCOLORSTATIC はダイアログの初期化時に送られる.
プログラムの状態により任意のタイミングで色を変更するには,InvalidateRect() などを呼び出す.そうすれば WM_CTLCOLORSTATIC が送信される.
(UpdateWindow が必要かもしれない)


WM_CTLCOLOR や WM_CTLCOLORSTATIC などは Windows がコントロールのデフォルト描画処理を行う直前のプレイベントである.ここで返すブラシハンドルを使用してコントロールの背景描画を行う.が,ブラシハンドルとして不正な値であればデフォルトの処理が行われ,結果背景が変わらないということになる.自分で作成したブラシハンドルを返せば,そのブラシを使って背景を描画してくれる.


ダイアログプロシージャでウィンドウメッセージのリターン値を返す時は通常 SetWindowLong() を使用する.
ダイアログプロシージャのリターン値はダイアログプロシージャ内で処理した場合は真を,処理しなかった場合は偽を返す.(WM_INITDIALOG以外)

しかし,WM_CTLCOLORSTATIC の場合 SetWindowLong() の方法では戻り値を返せない.
WM_CHARTOITEM
WM_COMPAREITEM
WM_CTLCOLOR
WM_INITDIALOG
WM_QUERYDRAGICON
WM_VKEYTOITEM
上記のメッセージに関しては DWL_MSGRESULT を使用せず,戻り値をそのまま返す.
(WM_NCHITTEST などは DWL_MSGRESULT でないと動作しない)


参照
ダイアログプロシージャの戻り値
エディットコントロールの背景色
前後のTips
スタティックコントロール色の変更

DSS ProgrammingTipsCGI Ver2.01