プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

コントロールに文字色/背景色を設定

2011年12月08日 04時48分00秒 | コントロール関連

GUI部品(Staticなど)のコントロールに文字色/背景色を設定するには次のようにします。(戻る)

  1. アプリケーションの初期化でブラシ・ハンドルを作成(CreateSolidBrush)
  2. コントロール・ウインドウにブラシ・ハンドルを設定(SetWindowLong)
  3. WM_CTLCOLORSTATIC メッセージでコントロールを処理(GetWindowLong)
  4. コントロール・ウインドウでブラシ・ハンドルを取得(GetWindowLong)
  5. アプリケーションの後始末でブラシ・ハンドルを削除(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_TEXT01SID_TEXT02SID_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以降)では利用できません。



コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ウインドウの移動位置を固定 | トップ | ウインドウの最大化/最小化... »
最新の画像もっと見る

コメントを投稿

コントロール関連」カテゴリの最新記事