コントロールの色の変更

このQ&Aのポイント
  • コントロールの色を変更する方法について教えてください。
  • ボタンとスタティックの色を変更する方法はありますか?
  • MFCを使用せずにボタンとスタティックの色を変更したいです。
回答を見る
  • ベストアンサー

コントロールの色の変更

初歩的な質問で申し訳ありません。 色々なHPを徘徊して調べているのですが、どうしてもうまくいきません。 コードはメッセージループに次のように記述しています。 --------------------------------------------------------- case WM_CTLCOLORBTN:   // 白色のブラシハンドルを返す   return (LRESULT)GetStockObject(WHITE_PEN); case WM_CTLCOLORSTATIC:   SetTextColor((HDC)wParam, RGB(255, 255, 255));   // 黒色のブラシハンドルを返す   return (LRESULT)GetStockObject(BLACK_PEN); --------------------------------------------------------- これでボタンは白、スタティックは黒地に白文字で表示されると思ったのですが、 ボタンは色が何も変わらず、スタティックは文字の周りを囲むように黒くなり、 肝心の文字の地は白のままでした。 解決策を知っている方、どうか教えていただけませんか? ちなみに、MFCは諸事情により使用できません。

質問者が選んだベストアンサー

  • ベストアンサー
  • A__
  • ベストアンサー率47% (22/46)
回答No.2

ボタンはオーナードローしか知りません。 オーナードローなら、コントロールのスタイルでBS_OWNERDRAWを加えれば 描画のたびにWM_DRAWITEMが来るようになります。 そうでなく、指定した時だけなら、PostMessage(xx, xx, SBT_OWNERDRAW, xx); でWM_DRAWITEMが来ます。 オーナードローすると最初に定義したボタンの文字が消えます。 LPDRAWITEMSTRUCT lpDI; RECT rect; case WM_DRAWITEM:  lpDI = (LPDRAWITEMSTRUCT)lParam;  CopyRect(&rect, &lpDI->rcItem);  FillRect(lpDI->hDC, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));  SetBkMode(lpDI->hDC, TRANSPARENT);//普通は灰色の文字の地に透過を指定  TextOut(lpDI->hDC, rect.left, rect.top, "ボタンの文字", 12);  return 0L; スタティックは文字の地の指定を追加しました。 case WM_CTLCOLORSTATIC:  SetTextColor((HDC)wParam, RGB(255, 255, 255));//テキスト自体の色。  SetBkColor((HDC)wParam, RGB(0, 0, 0));//普通は白の文字の地に黒を指定。  //↑は、代わりにSetBkMode((HDC)wParam, TRANSPARENT);で透過を指定してもいい。  return (LRESULT)GetStockObject(BLACK_BRUSH);

その他の回答 (1)

  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.1

ブラシハンドルを返すのでしたら  return (LRESULT)GetStockObject(WHITE_PEN);  return (LRESULT)GetStockObject(BLACK_PEN); を  return (LRESULT)GetStockObject(WHITE_BRUSH);  return (LRESULT)GetStockObject(BLACK_BRUSH); にかえればいいと思います。

関連するQ&A

  • エディットコントロール入力時の背景色変更について

    Win32 APIについて質問です。(前回質問させてもらった続きです) Microsoft Visual Studio .NET 2002、XP、API 2つのエディットコントロール(hEdit_DatDelay、hEdit_DatDelay2) のことなんですが、2つのエディットコントロールは、「0」を入力し フォーカスを外すと、メッセージを表示し、背景色を赤色表示する。 その後「0」以外の値を入力しフォーカスを外すと、背景色が元の 白色に戻る仕様を予定しています。 次のコードのように作成すると、両方のエディットコントロールで、 「0」を入力しフォーカスを外すとメッセージは表示しますが、 背景色は白色のままとなります。 (3)、(4)の行をコメントアウトすると「hEdit_DatDelay」のみ赤色と なります。 (1)~(4)のあたりが何か問題があるのではと思っているのですが、 お手上げ状態です。 ご存じの方すいませんがご教授の程よろしくお願いします。 //・・・ switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { //・・・ case IDC_DAT_DELAY: //一つ目のエディットコントロール switch (wmEvent) { case EN_KILLFOCUS: GetWindowText(hEdit_DatDelay , DatDelay , 4); DatDelay_int = atoi(DatDelay); if(DatDelay_int == 0) { Bck_Red = 1; MessageBox(hWnd, (PCTSTR)Text, _T("ftp"), MB_OK); SetFocus(hEdit_DatDelay); break; }else{ Bck_Red = 3; //(1) InvalidateRect(hEdit_DatDelay, NULL, TRUE); //(2) break; } break ; } break; case IDC_DAT_DELAY2://二つ目のエディットコントロール switch (wmEvent) { case EN_KILLFOCUS: GetWindowText(hEdit_DatDelay2 , DatDelay2 , 4); DatDelay_int2 = atoi(DatDelay2); if(DatDelay_int2 == 0) { Bck_Red = 2; MessageBox(hWnd, (PCTSTR)Text, _T("ftp"), MB_OK); SetFocus(hEdit_DatDelay2); break; }else{ Bck_Red = 4; //(3) InvalidateRect(hEdit_DatDelay2, NULL, TRUE); //(4) break; } break ; } break; //・・・ case WM_INITDIALOG: //ブラシの作成 RedBrush = CreateSolidBrush(RGB(255,0,0));// 赤ブラシ ClearBrush = (HBRUSH)GetStockObject( NULL_BRUSH );//透明 break; case WM_CTLCOLOREDIT: { switch(Bck_Red) { case 1: if ((HWND)lParam == GetDlgItem(hWnd, IDC_DAT_DELAY)) { SetBkColor((HDC)wParam, RGB(255,0,0)); //背景を赤色 return (LRESULT)RedBrush; } break; case 2: if ((HWND)lParam == GetDlgItem(hWnd, IDC_DAT_DELAY2)) { SetBkColor((HDC)wParam, RGB(255,0,0)); //背景を赤色 return (LRESULT)RedBrush; } break; case 3: SetBkColor( (HDC)wParam, GetSysColor( COLOR_WINDOW ) ); return (LRESULT)ClearBrush; break; case 4: SetBkColor( (HDC)wParam, GetSysColor( COLOR_WINDOW ) ); return (LRESULT)ClearBrush; break; default: break; } } break;

  • ウィンドウアプリが思うように動かない(GetWindowTextの使い方?)

    プログラミング初心者です。Windows XP, Visual Studio 2005 PE 使用。MFCは使わない(というより使い方がわからない…)。 簡単なウィンドウプログラムを作っています。エディットボックス1つとボタン1つを含むもので、ボタンを押すとエディットボックスの文字列を取得して、もしそれが close であればプログラムを終了するようにしたいんです。 自分で書いたコードの一部(プロシージャのみ)を以下に載せます。WM_CREATE、WM_DESTROYメッセージは省略。edit1はエディットボックスのハンドル、case式の2はボタンの子ウィンドウIDです。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ char lpString[6]; switch(msg){ case WM_COMMAND: switch(LOWORD(wParam)) { case 2: GetWindowText(edit1,lpString,6); if(lpString == "close") SendMessage(hWnd, WM_CLOSE, 0, 0); else SendMessage(edit1, WM_CLEAR, 0, 0); return 0; } return 0; default : return DefWindowProc(hWnd,msg,wParam,lParam); } return 0; } Visual Studioではちゃんとビルドしてくれるんですが、いざ実行してcloseと入力した上でボタンを押してもうんともすんとも言いません。原因は何でしょうか?素人ながらlpStringをそのまま取り出して使用してるのがまずいのではと思いますが、関数の使い方がわからず対処に困っています。教授いただければ幸いです。

  • コントロール内の文字の背景色

     hSWnd = CreateWindow("STATIC","あいう",WS_CHILD | WS_VISIBLE,               0,0,320,240,hWnd,NULL,hInst,NULL); に対して、  case WM_CTLCOLORSTATIC:      hBrush = CreateSolidBrush(RGB(0, 255, 0));      return (LRESULT)hBrush;  break; とすると、hSWnd は緑になるけど、hSWnd の あいう の文字の 背景色が白です。 その白の部分を赤にするソースを教えてください。

  • WM_PAINT

    WM_PAINT について教えてほしいのですが、 WM_PAINTがシステムから発行されるタイミングとして、 クライアント領域に無効領域がある時 UpdateWindow()を呼び出した時 InvalidateRect()を呼び出した時があると思いますが 例えば LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM) { LPCTSTR  Str = TEXT("Kitty"); switch (msg) { case WM_CREATE:    hdc = GetDC(hwnd);    SetTextColor(hdc , RGB(255, 0 , 0));    ReleaseDC(hwnd , hdc);    return 0; case WM_PAINT:    hdc = BeginPaint(hwnd , &ps);    TextOut(hdc, 10 , 10 , Str, lstrlen(Str));    EndPaint(hwnd , &ps);    return 0; } return DefWindowProc(hwnd , msg , wp , lp); } の場合, WM_PAINTはどのタイミングでシステムから呼び出されるんですか? WinMain()でUpdateWindow()もInvalidateRect()もつかっていないのですが。 いつシステムから送られるかご教授をお願いします。

  • resource.h

    win32、VC++2005で開発しております。 resource.h内の#defineで切ってあるIDの番号が重なっていたため 各コントロールの色を変更しようとすると同時に他のコントロールの色も変化してしまいました。 かなりのコントロール量だったのでExcelで開いて一気にインクリメントして再ロードするとコントロールの色が散らばってしまいました・・・ この方法はまずかったでしょうか? 色の変更は case WM_CTLCOLORSTATIC : i = GetWindowLong( (HWND)lParam, GWL_ID ); hdc = BeginPaint(hDlg, &ps); if ( i == IDC_ICHI_S ) { //位置出し SetTextColor( (HDC)wParam, RGB( 255, 255, 255 ) ); SetBkColor( (HDC)wParam, RGB( 0, 0, 255 ) ); return (LRESULT)CreateSolidBrush( RGB( 0, 0, 255 )); } if ( i == IDC_NIN_S ) { //任意(未知)の器械点セット SetTextColor( (HDC)wParam, RGB( 255, 255, 255 ) ); SetBkColor( (HDC)wParam, RGB( 0, 128, 0 ) ); return (LRESULT)CreateSolidBrush( RGB( 0, 128, 0 )); } EndPaint(hDlg, &ps); こんな感じでやってます。 resource.hのID名は変更してませんのでダイアログはちゃんと開きます。 resource.hの#defineの値は自動で割り振られたと思いますが、ダイアログ画面を複数書いて値が重複するのは変だと思いますがどうなんですか? また、見やすいように各画面ごとにIDを束ねようとしてるのですが普通なことでしょうか? プログラムコーディングの基準?常識?がよくわからないのでお願いします。 コントロールも膨大になってきて見ずらいです。 通常はどのように見やすくするのでしょうか? プログラム初心者なので分かり易い指摘でお願いします。

  • WM_NCLBUTTONUPについて

    タイトルバー上でのマウスボタンのアップを検出したいので、 WM_NCLBUTTONUPメッセージを拾うために、単純に以下のようなコードを書きました。 が、このコードではうまくWM_NCLBUTTONUPメッセージを拾えません。 ウィンドウを最大化しているときは問題なくメッセージを拾えるのですが、 それ以外の時(縮小表示)はメッセージを拾えません。 ただ、WM_NCLBUTTONDOWNは正しく拾うことができました。 ウィンドウが縮小表示になっている時にWM_NCLBUTTONUPを取得する場合には何か特殊な処理が必要なんでしょうか? ご存知の方がいらっしゃったら、よろしくお願いします。 // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_NCLBUTTONUP: MessageBox(hWnd, "UP", "LBUTTON", MB_OK); return 0; case WM_DESTROY: // ウインドウが破棄されたときの処理 PostQuitMessage(0); return 0; default: // デフォルトの処理 return DefWindowProc(hWnd, message, wParam, lParam); } }

  • なぜhButton1ボタンからのWM_COMMANDはフックできてクライアントエリアのWM_RBUTTONDOWNはフックできないのでしょうか?

    #define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc") #define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc") #define STRCOMMAND TEXT("ボタンが押されました") HWND hButton1; LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam) { CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam; HDC hDC; if(nCode==HC_ACTION) { hDC = GetDC(pcwpRetStruct->hwnd); switch(pcwpRetStruct->message) { case WM_COMMAND: TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND)); break; case WM_RBUTTONDOWN: TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON)); break; } ReleaseDC(pcwpRetStruct->hwnd, hDC); } return CallNextHookEx(NULL, nCode, wParam, lParam); } LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HHOOK hHook; HDC hDC; switch(uMsg) { case WM_DESTROY: UnhookWindowsHookEx(hHook); PostQuitMessage(0); return 0; case WM_CREATE: hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() ); if(!hHook) MessageBox(NULL, "hooking failed", NULL, MB_OK); hButton1 = CreateWindow( "BUTTON", "hButton1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 40, 100, 20, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL ); return 0; case WM_LBUTTONDOWN: hDC = GetDC(hWnd); TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON)); ReleaseDC(hWnd, hDC); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }

  • ダイアログボックスのボタンコントロールのフォーカスについて

    ダイアログボックスのボタンコントロールのフォーカスについて 教えて下さい。  モーダルダイアログにボタン「OK」を一つ貼り付けて それを「標準のボタン」(BS_DEFPUSHBUTTON)として作成したのですが ダイアログ表示直後は下画像(1)のようになってエンターキーを押しても 反応しません。何度かカーソルキーを押すとようやく(2)のように ボタンに枠線がついてエンターで押せるようになるのですが ダイアログ表示直後に(2)のようにするにはどうするべきでしょうか? ダイアログのコールバック・プロシージャ(WM_INITDIALOG部分でボタン作成) LRESULT CALLBACK SettingWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ switch (msg){ case WM_INITDIALOG: CreateWindowEx(0x00000000,"BUTTON","OK", WS_CHILD |WS_VISIBLE| WS_TABSTOP | BS_DEFPUSHBUTTON, 16,16,80,21,hWnd,(HMENU)IDOK,GetModuleHandle(0),0); return TRUE; } return FALSE; }

  • ウィンドウが表示されない

    あるサンプルプログラムを改造しようとしているのですが、g_hWnd=CreateWindow( _T(__FILE__),_T("シューティングゲーム"),WINDOW_STYLE, CW_USEDEFAULT,CW_USEDEFAULT,rc.right-rc.left,rc.bottom-rc.top, NULL,NULL,hInst,NULL);のところのWINDOW_STYLEをWS_OVERLAPPEDWINDOWに変えたらウィンドウが表示されません。どうしたら表示されるのでしょうか。わかる方いらいしたらご教授お願いします。多分ここだろうなというところのコードを載せます。 LRESULT CALLBACK MainWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_KEYDOWN: switch(wParam) { case VK_F1: ChangeDisplayMode(); return 0; case VK_ESCAPE: PostMessage(hWnd,WM_CLOSE,0,0); return 0; } return 0; case WM_DISPLAYCHANGE: // IDirect3DDevice9::Reset メソッドから Send される DisplayChange(); return 0; case WM_SIZE: if(g_bWndMode==false || wParam==SIZE_MINIMIZED) return 0; g_D3DPP.BackBufferWidth = LOWORD(lParam); g_D3DPP.BackBufferHeight = HIWORD(lParam); if(wParam==SIZE_MAXIMIZED || wParam==SIZE_RESTORED) ChangeWindowSize(); return 0; case WM_ACTIVATE: g_bActive=(LOWORD(wParam)!=WA_INACTIVE); return 0; case WM_DESTROY: CleanupD3DObject(); CleanupDXGraphics(); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,msg,wParam,lParam); }

  • ウィンドウやボタンコントロールの色を変えたい

    win32、VC++2005、windowsXPで開発中なのです。 まずウィンドウの色を変更したいのですが、 wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); のGetStockObjectの引数で白、灰、黒色には変更出来るのですが、 紫色にできませんでした。 色を変更するにはどうすればいいんですか? またボタンコントロールの色も変更したいのですがどうすればいいんでしょうか? 参考になるHPなどあると思ったのですが中々解りやすいサイトがありませんでした。 まったくのwin32プログラム初心者ですのでわかりやすく説明お願いします。

専門家に質問してみよう