EditBox全体の背景色を変更するには?


HELP!  2008-03-04 21:05:34  No: 67715

Edit Box内の文字列が変更されたら、背景色を黒、文字色を白に変更させたいのですが、
文字色と、文字部分のみの背景色が変わるだけで、Edit Box全体の背景色が変わりません。
文字色はOKですが、Edit Box全体の背景色を変更するには、どうしたら良いでしょうか?
処理はEditBox::CtlColor(CDC* pDC, UINT nCtlColor)で行っています。

HBRUSH EditBox::CtlColor(CDC* pDC, UINT nCtlColor){
  COLORREF bcr, cr;
  CBrush br;
  if(Edit Box内の文字列が変更された){
    switch(nCtlColor){
      case CTLCOLOR_EDIT:          
        cr = RGB(255, 255, 255);
        bcr = RGB(0, 0, 0);
        br.DeleteObject();
        br.CreateSolidBrush(bcr);
        pDC->SetBkColor(bcr);
        pDC->SetTextColor(cr);
        break;
  }
  return (HBRUSH)br;
}

ちなみに、リドローするとEdit Box全体の背景色が変わります。
なので、RedrawWindow()を呼ぶとEdit Box全体の背景色変わるのですが、
何度もON_WM_CTLCOLORメッセージが飛んでくるため、画面がチカチカします。

良い方法はないでしょうか?ご教授お願いいたします。


みい  2008-03-04 22:50:43  No: 67716

CBrush br;
をグローバルもしくはstatic


HELP!  2008-03-04 23:22:31  No: 67717

みいさん、ご回答ありがとうございます。

HBRUSH EditBox::CtlColor(CDC* pDC, UINT nCtlColor){
  COLORREF bcr, cr;
  static CBrush br;           //変更点
  if(Edit Box内の文字列が変更された){
    switch(nCtlColor){
      case CTLCOLOR_EDIT: 
        cr = RGB(255, 255, 255);
        bcr = RGB(0, 0, 0);
        br.DeleteObject();
        br.CreateSolidBrush(bcr);
        pDC->SetBkColor(bcr);
        pDC->SetTextColor(cr);
        break;
  }
  return (HBRUSH)br;
}

のように直しましたが、結果は変わらず、
文字部分の背景色しか変わりませんでした。
グローバルでも同様です。
EditBox全体の背景色を変えたいのですが、お分かりになりますか?
よろしくお願いいたします。


みい  2008-03-05 01:30:18  No: 67718

ごめんなさい。書きかけで送信してしまっててそのまま忘れてました(鬼)
私は派生クラスじゃなくて親ダイアログで変えてますけど、
OnCtlColor内でpDC->SetBkColorだけで全体の背景色変わってますよ。
ちなみにVC6。


夏みかん  2008-03-05 02:32:54  No: 67719

> 私は派生クラスじゃなくて親ダイアログで変えてますけど、
> OnCtlColor内でpDC->SetBkColorだけで全体の背景色変わってますよ。
これが正しい記述場所。

OnCtlColorはね親のダイアログに対する処理だよ。
だからエディットボックス(派生クラス)のOnCtlColor()を記述しても
処理されないんじゃないの?

もしエディットボックス(派生クラス)で処理するならOnPaint()とかに
記述する必要があると思う。

OnCtlColor()の書く場所が違うので親のダイアログに対する
OnCtlColor()に記述し直して見ましょう。


HELP!  2008-03-05 20:03:10  No: 67720

ありがとうございます。

すみません、説明不足でした。
> OnCtlColorはね親のダイアログに対する処理だよ。
> だからエディットボックス(派生クラス)のOnCtlColor()を記述しても
> 処理されないんじゃないの?
メッセージリフレクションを使っています。(ON_WM_CTLCOLOR_REFLECT)
なので処理はされるのですが、文字部分の背景色しか変わりません。
できればこの中で、処理できる方法があれば幸いです。

>> 私は派生クラスじゃなくて親ダイアログで変えてますけど、
>> OnCtlColor内でpDC->SetBkColorだけで全体の背景色変わってますよ。
> これが正しい記述場所。
直観的に良く分からないので、再度質問させてください。
例えば、親ダイアログにエディットボックス以外のコントロールがいる場合、
親ダイアログのOnCtlColorの中で背景色を変えてしまうと、
他のコントロールにも影響が出そうな気がするのですが、間違った解釈をしていますか?

> もしエディットボックス(派生クラス)で処理するならOnPaint()とかに
> 記述する必要があると思う。 
エディットボックス内の値を変更した瞬間に、背景色を変えたいのですが
OnPaint()で出来ますか?

ご教授お願いいたします。


みい  2008-03-05 20:37:06  No: 67721

>例えば、親ダイアログにエディットボックス以外のコントロールがいる場合、
>親ダイアログのOnCtlColorの中で背景色を変えてしまうと、
>他のコントロールにも影響が出そうな気がするのですが、間違った解釈を
>していますか?
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)には引数が3つあって、
pWndがイベントが発生したコントロールのハンドルになります。
if ((NULL != pWnd) && (IDC_XXX == pWnd->GetDlgCtrlID()))
{
    pDC->SetBkColor(XX);
}


みい  2008-03-05 21:19:31  No: 67722

エディットボックス内の値を変更した瞬間に背景色を変えたいのなら、
テキスト変更イベント(EN_CHANGE)でエディットボックスに対して
描画更新関数(Invalidateとか)を呼んでやったらよいかと。


wclrp ( 'o')  2008-03-06 17:47:48  No: 67723

俺が昔やった時では
pDC->SetBkColorだけだと
文字だけの背景だったけど。
ブラシも返す必要がある。

すぐに背景色を変えたいのなら
俺も描画を要求すればいいと思う。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加