• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エディットボックスの背景の色変更方法)

エディットボックスの背景の色変更方法

このQ&Aのポイント
  • C++初心者の方が、エディットボックスの背景色変更方法について質問しています。
  • 現在、ダイアログボックスにエディットボックスを配置し、文字は表示できるが背景色の変更ができない状況です。
  • また、質問が変わってしまいますが、ダイアログウィンドウに100個のエディットボックスを作成し、それらの背景色を変更することも考えているようです。

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

  • ベストアンサー
回答No.1

SetBkColor を使うんだったら、WM_PAINT ではダメみたいですね。 とりあえず、WM_CTLCOLOREDIT だと背景色が変わります。 INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HBRUSH hbrush; switch (message) { case WM_INITDIALOG: hbrush = CreateSolidBrush( RGB( 0, 255, 0 ) ); return (INT_PTR)TRUE; case WM_CTLCOLOREDIT: SetBkColor( (HDC)wParam, RGB( 0, 255, 0 ) ); SetWindowLong( hDlg, DWL_MSGRESULT, ( LPARAM )hbrush ); // ←なくても大丈夫かも return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } ただしこの方法では、フォントが小さくて余白がある場合、余白は指定した背景色にはならないみたいです。 他にもやり方があるのかもしれませんが、サブクラス化してエディットコントロールの WM_PAINT で塗りつぶしてやると、いい感じになります。 WNDPROC OrgEditProc; INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HBRUSH hbrush; HWND hwndEdit; switch (message) { case WM_INITDIALOG: hwndEdit = GetDlgItem( hDlg, IDC_EDIT1 ); OrgEditProc = ( WNDPROC )SetWindowLong( hwndEdit, GWL_WNDPROC, ( LPARAM )EditProc ); hbrush = CreateSolidBrush( RGB( 0, 255, 0 ) ); return (INT_PTR)TRUE; case WM_CTLCOLOREDIT: SetBkColor( (HDC)wParam, RGB( 0, 255, 0 ) ); SetWindowLong( hDlg, DWL_MSGRESULT, ( LPARAM )hbrush ); return (INT_PTR)TRUE; } return (INT_PTR)FALSE; } INT_PTR CALLBACK EditProc(HWND hwndEdit, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rc; HBRUSH hbrush; switch( message ) { case WM_PAINT: hdc = BeginPaint( hwndEdit, &ps ); hbrush = CreateSolidBrush( RGB( 0, 255, 0 ) ); GetClientRect( hwndEdit, &rc ); FillRect( hdc, &rc, hbrush ); EndPaint( hwndEdit, &ps ); DeleteObject( hbrush ); } return( CallWindowProc( OrgEditProc, hwndEdit, message, wParam, lParam ) ); } >Rectangleで座標指定で100個の箱を作成する方がCPU負荷などもないのかなーって思います。 これは、よくわかりませんでした。Rectangle で作った箱にはテキスト入力しないのだったらそれで良いと思いますけど・・・。

t-osk1109
質問者

お礼

回答ありがとうございます。教えて頂いた方法でできました。ありがとうございました。最初はダイアログプロシージャの戻り値の型をBOOLのまましておりましたので、できなく悩んでおりましたが、INT_PTR型にしてreturnでTRUEを返すとできました。TRUEではなく、ブラシハンドルを返すとその色で、全体の色替えもできるということも学びました。大変参考になりました、ありがとうございました。また、よろしくお願いします。

関連するQ&A