• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:3つのスタティックに共通の動作をさせる手法)

3つのスタティックに共通の動作をさせる手法

このQ&Aのポイント
  • 現在、Visual Studio 2005にてVisual C++のMFCを使ったダイアログベースのプログラムを作成しています。オリジナルのCStatic継承のクラスを作成し、そのインスタンスを3つ、メインダイアログ内のメンバ変数として定義します。これらのインスタンスの動作としては、1秒毎に乱数を計算し、それをダイアログ上に表示させる、といったことをします。3つのCStaticにはある範囲をもたせており、乱数がその範囲外になるとCStaticの数値、背景の色を変更させたいと思っています。そこで、これら3つのうち、1つでもその乱数が範囲外になった場合に、3つとも全てのCStaticの数値、背景の色を変化させるにはどのようにすればいいでしょうか?
  • イメージとしては、3つのCStaticがある1つの親からの継承で、その親側で色の変化のコードを作成すれば、それが子のクラスのCStaticクラスにも影響を与えるのかな?と思っています。
  • 開発環境はWindows CE 6.0とVisual Studio 2005です。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

親クラスに追加したpublic/protectedのメソッドなら子クラスに継承されます しかし、インスタンスが別であるオブジェクトは個別に再描画しないといけないでしょう CBaseStatic : public CStatic { public: // コンストラクタ CBaseStatic(); // カラー変更メソッド void SetBkColor( COLORREF clr ); protected: // 背景色保持用の変数 COLORREF m_bkColor; CBrush m_brBack; }; とすれば SetBkColorは子クラスへ継承されます 実装は void CBaseStatic::SetBkColor(COLORREF clr ) {   if ( m_brBack.m_hObject )   m_brBack.DeleteObject();   if ( m_bkBack != clr ) {     m_brBack.CreateSolidBrush( clr );     m_bkColor = clr;     // ここで再描画するように促す     Invalidate();   } } としておけばいいように思います DLGのほうでは m_ctlStatic1.SetBkColor( RGB( 255, 0, 0 ) ); m_ctlStatic2.SetBkColor( RGB( 255, 0, 0 ) ); m_ctlStatic3.SetBkColor( RGB( 255, 0, 0 ) ); などのように 3個のオブジェクト個別に設定する必要があります

fujtomo
質問者

お礼

ご回答ありがとうございます。 早速、オリジナルのCStaticクラスの親クラスCBaseStaticクラスを作成し、CBaseStatic内にredfox63様から教えて頂いたSetBkColor関数を追加し、メインダイアログでオリジナルのCStaticクラス(CBaseStaticの派生)のインスタンスm_st_origin1を作成し、 m_st_origin1.SetBkColor(RGB(255,0,0)); とコードを入力してみたところ、背景色を変化させることが出来ませんでした。 これはやはり、スタティックコントロールの背景色などを変化させるにはOnCtlColor()内でなければならないからでしょうか?

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

http://oshiete1.goo.ne.jp/qa5022902.html で質問されていたんですよね このときの OnEraseBkgndで背景を塗りつぶしていたと思います 同じようにCBaseStaticにOnEraseBkgndで pDC->FillRect( rc, &m_brBack ); としてやれば いいはずですけど OnPaintの場合も dc.SetBkColor( m_bkColor ); などを追加する必要があるでしょう ・・・

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

親クラスじゃなくて、派生クラスのほうに、staticのメンバー変数を用意して、それをフラグとして用いるのはどうでしょう。

fujtomo
質問者

お礼

ご回答ありがとうございます。 理解力不足で申し訳ないのですが、 >派生クラスのほうに、staticのメンバー変数を用意して、それをフラグとして用いるのはどうでしょう というのは、オリジナルに作成したCStaticクラスの派生クラスにメンバ変数を作成するということでしょうか? それをどのようにすればよいかイメージがわきません。 もし宜しければ、もう少し詳しく説明していただけませんでしょうか?

関連するQ&A