はじめまして。VC初心者です。
EditBoxの背景色の変更について質問します。
現在、監視プログラムの改造を行っており、受信した監視データによってEditBoxの色を変更できるようにしたいのですが…
参考書にはOnCtlColorで変更するように書かれていますが、参考としている別のプロジェクトでは、カラー変更用のクラスを立ててそこからSetBkColor()を参照していました。
参考書どおりに行うと、条件によって背景色を変えるのが難しくなり、カラー変更用のクラスを立てて行うと、文字が入力される箇所しか背景色が変更されません。
(ちなみに、カラー変更用のクラスは下記のサイトのを参考にしました)
http://plaza.harmonix.ne.jp/~fakira/cppdoc/custum.htm
他のクラスでも背景色を変えなければならないので、出来る事ならばカラー変更用のクラスを立てる方法でいきたいのですが…
超がつくほど初心者なので、ご教授いただけるとありがたいです。
m_brushとSetBkColorで背景色が変わると思うけど違ったのかな。
m_brushを作り直している?
条件が変わったのに反映しないってこと?
一旦ウィンドウを最小化したり他のウィンドウの背後に隠した後
表示させると背景色が変更されるのならば
描画しなおしが行われないから反映されない。
以下は動作確認していないので上手く行くか知りません。
HBRUSH CColorStatic::SetBgColor(COLORREF newBgColor)
{
m_bgColor = newBgColor;
m_brush.DeleteObject();
m_brush.CreateSolidBrush(newBgColor);
if(m_hWnd != NULL) RedrawWindow();
}
HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetTextColor(m_color);
pDC->SetBkColor(m_bgColor);
return m_brush;
}
くぐったら、こんなの、ありました。
http://homepage3.nifty.com/mitui707/VisualC/VCeditbox.html/
サブクラスにする、しない、は別問題で、サブクラスで、WM_CTLCOLOR をハンドルできませんか。
なんだか別なところに問題があるような気もします。
サブクラスの親クラスは、CEdit になっていますか。
wclrp ( 'o')さん
確かにm_brushとSetBkColorを使っているのですが、別クラスで参照する形で呼び出すとエラーが起きます。
SetBgColorの関数は自分で書き込む関数なのでしょうか?それとも、CtlColorみたいにダイアログから追加して書く関数なのでしょうか?
ワラントさん
そのサイトも参考にしましたが、条件で変えるのが難しくて…
サブクラスでWM_CTLCOLORはハンドルしました。
親クラスもCEditにしてあります。
私の書き方がおかしいかもしれませんので、もう一度見直してみます。
「条件で変える」とは、どんな感じでしょうか。
単純に、フラグを立てて、それによってブラシを替えるのでは用をなさないのでしょうか。
ごめんなさい。
もうひとつ。
「別クラスで参照する形で呼び出す」とは、どんなふうにしているのでしょうか。
どんなエラーになりますか。
ワラントさん
条件は、「回線がオープンしていない」「情報が異常」「受信中」「受信完了」の4つです。それぞれの条件の時に、指定された色に変更するというものです。
一度にできないので、とりあえず「回線オープン」の条件でフラグを立ててブラシを変えてやってみたのですが、変化はありませんでした。
別クラスで参照する形で呼び出すというのは、m_ed1.SetBkColor=RGB(0,0,255)といった形です。
m_ed1は背景色を変えたいEditBoxを指します。
こうすると、「SetBkColorはm_ed1のメンバにありません。m_ed1の宣言を確認してください」と出ます。
しかし、参考にしているプログラムはこうした形で色の変更ができているので、何とかこの形で変更を行いたいのですが…
すみません、間違えました!
別クラス参照というのは、色変更の関数があるクラスのポインタを作り、
「(ポインタ)->SetBkColor=RGB(0,0,225)」
といった形で行いました。
これも、参考にしたプログラムで書かれていた形なのですが…
.NET2003以上、MFCという前提で、もう試しているかもしれませんが、
まず、前にリンクしたページのサンプルをダウンロードして、エディットボックスの背景色が変わるか試してみましょう。
ダウンロードするのが嫌なら、ページの通りに新しくアプリケーションを作ってみましょう。
ページに書いてある通りで、間違いなく背景色は変わるようです。
問題がなければ、とりあえずサブクラスのことは考えずに、フラグによって、背景色が変わるようなコードに作り直してみましょう。
それに成功したら、そのコードを自分のアプリケーションに移して、変わることを確かめましょう。
それにも成功したら、サブクラスを作ってコードを移し、それでも背景色を操作できること確かめましょう。
どこでひっかかりますか。
ワラントさん
>どこでひっかかりますか。
やってみた所、アプリケーションに移して確かめようとしたときに、「ハンドルされていない例外処理は〜」と出て止まってしまいます。
具体的にあなたのプログラムを見ているわけじゃないので推測だけど
ポインタの使い方を間違えていますよ。
そもそもポインタ使わなくても出来たし。
作ってみたよ
http://wclrp.blog90.fc2.com/blog-entry-37.html
wclrp ( 'o') さん
ありがとうございます!!
ポインタの使い方が間違っていたのは、先輩からも指摘されました。
wclrp ( 'o') さんのソースを参考に、もう一度再構成させていただきます!
ありがとうございました!
ツイート | ![]() |