プロが教える店舗&オフィスのセキュリティ対策術

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;

A 回答 (2件)

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;
といった具合で ・・・
    • good
    • 0
この回答へのお礼

対応ありがとうございました。
回答のとおり実施しましたら、背景色の切替が
思い通りに切り替わりました。
お礼の返答遅れてすいません。
内容を理解するのに時間が掛かったもので。
本当にありがとうございました。

お礼日時:2008/12/02 09:19

サンプルプログラムを作成してみたので、参考にしてみてください。


ちと大きくなったので、次のリンクからダウンロードお願いします。
http://yanchde.gozaru.jp/test/ctl_edit_color_sam …

肝になる処理は、
onEditKillFocus()と、onCtlColorEdit()にあります。

youzan1のコード拝見させて頂きましたが、
もう少し、メッセージ処理を整理する工夫をしてみると、
問題個所を特定しやすいと思いますよ。
    • good
    • 0
この回答へのお礼

対応ありがとうございました。
お礼の返答遅れてすいません。
サンプルプログラムの内容を見させてもらいました。
参考にさせて頂きます。
あと、メッセージ処理整理の必要性実感しました。
本当にありがとうございました。

お礼日時:2008/12/02 09:22

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