アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++初心者です。
どうしても、答えが出てこないことがあり質問致します。

環境
VC++Express2008 Win32API ダイアログベース

ダイアログにResEditにエディットボックスを配置して
あとは文字や背景の色替えをコーディングしてます。
文字は表示できるのですがその背景を色替えができません。
いろいろ、ネットで調べるも、ほとんどMFCのサンプルばかりで
意味がわかりません。
テストプログラムは以下です。

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst = hInstance;
//ダイアログボックス表示
DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);

return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
HWND pWnd;
PAINTSTRUCT ps;

switch (msg)
{
case WM_INITDIALOG:
break;
case WM_PAINT:

pWnd = GetDlgItem(hWnd, IDC_EDIT10);
hdc = BeginPaint(pWnd,&ps);
SetBkColor(hdc, RGB(0,255,0)); //←うまくいかない!!
SetWindowText(pWnd, _T("aaa"));
EndPaint(pWnd, &ps);
      break;
 
      以下省略

これで、テキスト"aaa"は表示されますが、背景は変わりません。
SetBkColorの使い方がまずいと思うのですが
僕のイメージ的にSetWindowTextと同じようにウィンドウハンドル指定で
背景を変える方法ってないのかなって素人ながら思うのですが、、わかりません。
あと、質問が変わってしまうのですが、ダイアログウィンドウに100個くらいのエディットボックスを
作成して、それらの背景色を替えて状態表示(点滅もあり)を行うようなものを作りたいのですが
ナンセンスなのでしょうか?
Rectangleで座標指定で100個の箱を作成する方がCPU負荷などもないのかなーって思います。
では、質問の内容がよくわからない点などあるかもしれませんが
よろしくお願いいたします。
    

A 回答 (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 で作った箱にはテキスト入力しないのだったらそれで良いと思いますけど・・・。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/06 21:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A