
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オーバーレイみたいな処理がしたい
-
ボタンの色(WINAPI)
-
Win32APIにて、ウィンドウ全体...
-
main.c:7:43: warning: implici...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
Enterキーを押されたら次の処理...
-
有効数字について 以前質問をし...
-
プログラムでの数字につく”f”の...
-
「指定されたキャストは有効で...
-
20'(角度)の計算がわかりま...
-
複数桁10進数の*桁目だけを抽出...
-
信頼区間の1.96や1.65ってどこ...
-
C言語での引数の省略方法
-
do-while文が禁止される理由
-
エクセルで可視セルにのみ値貼...
-
ファイル操作で全角空白を消す
-
値差の%計算方法について
-
2÷3などの余りについて
-
#if 1 #elseの意味について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
エラー Run-Time Check Failur...
-
C#のswitch文を簡略化したいの...
-
プログラミングでエラーが出ま...
-
Win32APIでウィンドウを中央に...
-
Unicode でのWin32アプリのプロ...
-
c言語初心者です。ついに。。
-
LoadImageを使用し、タイトルバ...
-
AVRによるマトリクスLED制御
-
オーバーレイみたいな処理がしたい
-
MessageBoxについて
-
ダイアログプログラムでEnterキ...
-
Win32 APIでのVirtual-Key Co...
-
Win32のファイルダイアログのサ...
-
キャレットの現在位置の表示 (W...
-
C言語です
-
ボタンの色(WINAPI)
-
WinAPIでの画像高速切り替え表...
-
WM_KEYDOWNでPrtScを捕まえる方...
-
ウィンドウサイズを変更しても...
おすすめ情報