
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負荷などもないのかなーって思います。
では、質問の内容がよくわからない点などあるかもしれませんが
よろしくお願いいたします。
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 で作った箱にはテキスト入力しないのだったらそれで良いと思いますけど・・・。
回答ありがとうございます。教えて頂いた方法でできました。ありがとうございました。最初はダイアログプロシージャの戻り値の型をBOOLのまましておりましたので、できなく悩んでおりましたが、INT_PTR型にしてreturnでTRUEを返すとできました。TRUEではなく、ブラシハンドルを返すとその色で、全体の色替えもできるということも学びました。大変参考になりました、ありがとうございました。また、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) こんなことできますか?例えば、sheetに貼り付けた図形のタイトルを、セルA1の文字で表示する。 5 2022/04/22 15:25
- Visual Basic(VBA) 昨日、質問した件『VBA にて、条件付き書式で背景色を設定しているセルの範囲で、背景色付きのセルをカ 4 2022/04/07 14:39
- その他(ブラウザ) zoomのバーチャル背景が選べない 4 2022/12/08 12:38
- PowerPoint(パワーポイント) PowerPointの背景について 1 2023/03/12 15:22
- Windows 95・98 タスクバーの背景の色だけを変えたい。 2 2022/07/13 14:44
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- 写真・ビデオ スマホ(シャープSENSE7-53C)の背景色を変更したい 2 2023/08/09 11:50
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Excel(エクセル) 条件付き書式の設定方法を教えて下さい。 2 2023/04/14 18:12
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
CStringをwchar_tに変換したい
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
6
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
7
リストコンロールの一行だけを太文字に(VC++)
C言語・C++・C#
-
8
エディットボックスの入力制限について
C言語・C++・C#
-
9
エディットコントロールの色の変更方法
C言語・C++・C#
-
10
ラベル(スタティックテキスト)内での改行。
C言語・C++・C#
-
11
テキストボックスからフォーカス外す
C言語・C++・C#
-
12
ラジオボタンのグループ化
C言語・C++・C#
-
13
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
14
エディットコントロールでEnter押した時の動作
C言語・C++・C#
-
15
コントロールの背景色を
C言語・C++・C#
-
16
CWnd::EnableWindow()の扱い方
C言語・C++・C#
-
17
OnDrawが呼び出されません
C言語・C++・C#
-
18
SetDlgItemTextの使い方について
C言語・C++・C#
-
19
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
20
エディットボックスのフォントを変えたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー Run-Time Check Failur...
-
C#のswitch文を簡略化したいの...
-
オーバーレイみたいな処理がしたい
-
ポップアップメニュー
-
Unicode でのWin32アプリのプロ...
-
エディットボックスの背景の色...
-
Win32のファイルダイアログのサ...
-
ウィンドウハンドルがメッセー...
-
C言語win32api、エディットボッ...
-
WinAPIでの画像高速切り替え表...
-
Win32APIでウィンドウを中央に...
-
Enterキーを押されたら次の処理...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
エクセルで可視セルにのみ値貼...
-
2÷3などの余りについて
-
10個出力で改行したいのですが...
-
C言語での引数の省略方法
-
O(n log n)について2
-
#define _CRT_SECURE_NO_WARNIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
エラー Run-Time Check Failur...
-
プログラミングでエラーが出ま...
-
ボタンの色(WINAPI)
-
Win32APIでウィンドウを中央に...
-
C言語win32api、エディットボッ...
-
C#のswitch文を簡略化したいの...
-
ウィンドウ非表示に時に表示し...
-
不明なエラー
-
COMPORTマルチスレッドで例外発生
-
WM_CREATE について
-
コンソールアプリケーションの...
-
別関数に渡す変数のポインタが...
-
作成プログラムを常にアクティ...
-
DialogBox
-
【Windowsアプリ】ファイルのド...
-
オーバーレイみたいな処理がしたい
-
ボタンのアイコン表示
-
ウィンドウのサイズ変更について
おすすめ情報