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;
No.1ベストアンサー
- 回答日時:
EN_SETFOCUSで何かの処理をしていませんか?
ClearBrushの生成は GetStockObject( WHITE_BRUSH ); または CreateSolidBrush( GetSysColor( COLOR_WINDOW ) ); の方がいいかもしれません
EditBox1とEditBox2で背景色の制御用の変数を分けてみても現象は変わりませんか?
int Back_Red1, BackRed2
といった具合に
エディットボックスから整数を取得するのであれば
GetDlgItemIntを使ったほうが簡単ですよ
BOOL bTrans;
int nData;
を準備して
// -32768 から 32767の間でいいなら 最後のFALSEをTRUEに
nData = GetDlgItemInt( hWnd, wmId, &bTrans, FALSE );
if ( bTrans != TRUE || nData != 0 ) {
// データが0以外の場合 または655536以上 0未満の場合
if ( (HWND) lParam == hEdit_DatDlay ) {
Back_Red1 = 0;
} else {
Back_Red2 = 0;
}
} else {
// データが0の場合
if ( (HWND) lParam == hEdit_DatDlay ) {
Back_Red1 = 1;
} else {
Back_Red2 = 1;
}
}
InvalidateRect( (HWND)lParam, NULL, TRUE );
case WM_CTLCOLOREDIT: の部分は
デバイスコンテキスト用の変数hdc
背景用のCOLORREF型のcolorとブラシ用のhBrを準備して
hdc = (HDC)wParam;
if ( (HWND)lParam == hEdit_DatDaly ) {
if ( Back_red1 ) {
color = RGB( 255, 0, 0 );
hBr = RedBrush;
} esle {
color = GetSysColor( COLOR_WINDOW );
hBr = ClearBrush;
}
} else {
if ( Back_red2 ) {
color = RGB( 255, 0, 0 );
hBr = RedBrush;
} esle {
color = GetSysColor( COLOR_WINDOW );
hBr = ClearBrush;
}
}
::SetBkColor( hdc, color );
return (LRESULT)hBr;
といった具合で ・・・
対応ありがとうございました。
回答のとおり実施しましたら、背景色の切替が
思い通りに切り替わりました。
お礼の返答遅れてすいません。
内容を理解するのに時間が掛かったもので。
本当にありがとうございました。
No.2
- 回答日時:
サンプルプログラムを作成してみたので、参考にしてみてください。
ちと大きくなったので、次のリンクからダウンロードお願いします。
http://yanchde.gozaru.jp/test/ctl_edit_color_sam …
肝になる処理は、
onEditKillFocus()と、onCtlColorEdit()にあります。
youzan1のコード拝見させて頂きましたが、
もう少し、メッセージ処理を整理する工夫をしてみると、
問題個所を特定しやすいと思いますよ。
対応ありがとうございました。
お礼の返答遅れてすいません。
サンプルプログラムの内容を見させてもらいました。
参考にさせて頂きます。
あと、メッセージ処理整理の必要性実感しました。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(プログラミング・Web制作) powershell で書いたプログラムでcd が動かない 5 2023/04/08 14:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エディットボックスの背景の色...
-
この列挙体でsysjanの関数はあ...
-
画像を表示したいのですが……
-
不明なエラー
-
エラー Run-Time Check Failur...
-
COMPORTマルチスレッドで例外発生
-
子ウインドウの作成と破棄について
-
エディットコントロール入力時...
-
音量調節
-
WM_CREATE について
-
プログラミングでエラーが出ま...
-
Enterキーを押されたら次の処理...
-
fgetsなどのときのstdinのバッ...
-
マイナスからプラスへ転じた時...
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
「an=(n-1)/(n+1)のときlim[n→∞...
-
c言語で、繰り返し文の中で、0....
-
C言語での引数の省略方法
-
正負を反転させて出力するプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
ダイアログプログラムでEnterキ...
-
キャレットの現在位置の表示 (W...
-
PeekMessageについて
-
ウィンドウ非表示に時に表示し...
-
C#のswitch文を簡略化したいの...
-
C言語win32api、エディットボッ...
-
音量調節
-
LoadImageを使用し、タイトルバ...
-
プログラミングでエラーが出ま...
-
エディットコントロール入力時...
-
ウィンドウハンドルがメッセー...
-
ボタンの色(WINAPI)
-
画像を表示したいのですが……
-
WINAPIでキーから文字列を入力...
-
エラー Run-Time Check Failur...
-
エディットボックスの背景の色...
-
Win32APIでアイコンファイルを...
-
WM_KEYDOWNでPrtScを捕まえる方...
おすすめ情報