GUI部品(Staticなど)のコントロールに文字色/背景色を設定するには次のようにします。(戻る)
- アプリケーションの初期化でブラシ・ハンドルを作成(CreateSolidBrush)
- コントロール・ウインドウにブラシ・ハンドルを設定(SetWindowLong)
- WM_CTLCOLORSTATIC メッセージでコントロールを処理(GetWindowLong)
- コントロール・ウインドウでブラシ・ハンドルを取得(GetWindowLong)
- アプリケーションの後始末でブラシ・ハンドルを削除(DeleteObject)
プロトタイプ宣言
LONG GetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex // 取得するデータ値のインデックス ); LONG SetWindowLong( HWND hWnd, // ウィンドウのハンドル int nIndex, // 設定するデータ値のインデックス LONG dwNewLong // 新しい値 );
サンプル
- サンプルでは Static コントロールのウインドウに任意の32ビットデータ(ブラシ・ハンドル)を SetWindowLong 関数で割り当てます。
- そして Static コントロールのウインドウから任意の32ビットデータ(ブラシ・ハンドル)を GetWindowLong 関数で取得してます。
- この方法でブラシ・ハンドルを管理してますので構造体などを使わずにシンプルで処理可能。
//------------------------------------------------------------------------------ // コントロールに文字色/背景色を設定 //------------------------------------------------------------------------------ #include <tchar.h> #include <Windows.h> #include "resource.h" //------------------------------------------------ // break 付きのキーワード //------------------------------------------------ #define CASE break;case #define DEFAULT break;default //------------------------------------------------ // ダイアログ全体の初期化(ブラシの作成) //------------------------------------------------ static VOID funcInitDialog( HWND hDlg ) { SetWindowLong( GetDlgItem(hDlg,SID_TEXT01), GWL_USERDATA, (LONG)CreateSolidBrush(RGB(0x00,0x00,0x00)) ); SetWindowLong( GetDlgItem(hDlg,SID_TEXT02), GWL_USERDATA, (LONG)CreateSolidBrush(RGB(0x33,0x00,0x00)) ); SetWindowLong( GetDlgItem(hDlg,SID_TEXT03), GWL_USERDATA, (LONG)CreateSolidBrush(RGB(0x00,0x33,0x00)) ); } //------------------------------------------------ // ダイアログ全体の後始末(ブラシの削除) //------------------------------------------------ static VOID funcTermDialog( HWND hDlg ) { DeleteObject( (HGDIOBJ)GetWindowLong(GetDlgItem(hDlg,SID_TEXT01),GWL_USERDATA) ); DeleteObject( (HGDIOBJ)GetWindowLong(GetDlgItem(hDlg,SID_TEXT02),GWL_USERDATA) ); DeleteObject( (HGDIOBJ)GetWindowLong(GetDlgItem(hDlg,SID_TEXT03),GWL_USERDATA) ); EndDialog( hDlg, IDOK ); } //------------------------------------------------ // コントロールに文字色/背景色を設定 //------------------------------------------------ static BOOL funcCtlColorStatic( HDC hDC, HWND hCtrl ) { switch ( GetDlgCtrlID(hCtrl) ){ CASE SID_TEXT01: SetBkColor( hDC, RGB(0x00,0x00,0x00) ); SetTextColor( hDC, RGB(0xFF,0xFF,0x00) ); CASE SID_TEXT02: SetBkColor( hDC, RGB(0x33,0x00,0x00) ); SetTextColor( hDC, RGB(0xFF,0x00,0x00) ); CASE SID_TEXT03: SetBkColor( hDC, RGB(0x00,0x33,0x00) ); SetTextColor( hDC, RGB(0x00,0xFF,0x00) ); DEFAULT:return 0; } return (BOOL)GetWindowLong(hCtrl,GWL_USERDATA); } //------------------------------------------------ // ダイアログのプロシージャ関数 //------------------------------------------------ static BOOL CALLBACK mainDialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch ( uMsg ){ CASE WM_INITDIALOG: funcInitDialog( hDlg ); CASE WM_CLOSE: funcTermDialog( hDlg ); CASE WM_CTLCOLORSTATIC: return funcCtlColorStatic( (HDC)wParam, (HWND)lParam ); DEFAULT: return FALSE; } return TRUE; } //------------------------------------------------ // メイン関数 //------------------------------------------------ extern int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { UNREFERENCED_PARAMETER( hPrevInstance ); UNREFERENCED_PARAMETER( lpCmdLine ); UNREFERENCED_PARAMETER( nCmdShow ); return DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG01), NULL, mainDialogProc ); }
- 上記のサンプルでは、Static コントロールなので WM_CTLCOLORSTATIC メッセージを使ってます。
- また、サンプルでは SID_TEXT01、SID_TEXT02、SID_TEXT03 の3つに文字色と背景色を設定してます。
- SID_TEXT01 の文字色は黄色、背景色は黒色です。
- SID_TEXT02 の文字色は赤色、背景色は暗い赤色です。
- SID_TEXT03 の文字色は緑色、背景色は暗い緑色です。
メッセージの定数
定数 | 意味 | 備考 |
---|---|---|
WM_CTLCOLORDLG | これはダイアログの背景のみを設定。 | |
WM_CTLCOLORBTN | プッシュボタンの文字色/背景色を設定。 | 実際にはオーナー・ドローと呼ばれる方法で設定しないと文字色/背景色を操作できません。 |
WM_CTLCOLOREDIT | エディットボックスの文字色/背景色を設定。 | コンボボックスの入力部もエディットボックスなので操作可能。 |
WM_CTLCOLORLISTBOX | リストボックスの文字色/背景色を設定。 | コンボボックスのリスト部もリストボックスなので操作可能。 |
WM_CTLCOLORSTATIC | スタティック・コントロールの文字色/背景色を設定。 | チェックボタン、ラジオボタンも WM_CTLCOLORSTATIC で操作可能。 |
WM_CTLCOLORMSGBOX | メッセージボックスの文字色/背景色を設定。 | 16 ビット版(Win3.1)の名残で 32 ビット版(Win95以降)では利用できません。 |
WM_CTLCOLORSCROLLBAR | スクロールバーの文字色/背景色を設定。 | 16 ビット版(Win3.1)の名残で 32 ビット版(Win95以降)では利用できません。 |
※コメント投稿者のブログIDはブログ作成者のみに通知されます