いつもお世話になります。
AboutDialogにあるstatic textの背景を設定している段階でおかしな現象に遭遇しました。
色々考えたのですが分かりませんのでどなたかご教授下さい。
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// ダイアログ データ
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard 仮想関数のオーバーライドを生成します。
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV のサポー
ト
//}}AFX_VIRTUAL
// インプリメンテーション
protected:
//{{AFX_MSG(CAboutDlg)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
COLORREF textBackColor; //ここでメンバー変数として宣言
COLORREF backColor; //
CBrush backBrush;
CBrush textBackBrush;
};
以上は共通です。
以下に異なる二つの表記をします。
①
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
srand(unsigned(time(NULL)));
cbackColor = RGB(rand()%256,rand()%256,rand()%256);
backBrush.CreateSolidBrush(backColor);
textBackColor = RGB(200,10,200);//普通にセット
textBackBrush.CreateSolidBrush(textBackColor);
}
この場合、正しくstatic textの背景色がセットされます。
しかし、
②
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
srand(unsigned(time(NULL)));
const backColor = RGB(rand()%256,rand()%256,rand()%256);
backBrush.CreateSolidBrush(backColor);
const textBackColor = RGB(200,10,200);
//constを入れてセットする
textBackBrush.CreateSolidBrush(textBackColor);
}
こうするとstatic textの背景色は確かにセットされるのですが、更に文字の部分のみ灰色の背
景色となります。
そこで質問です。
#1:そもそも変数をコンストラクタで宣言してあるのに、改めてconstを用いることが文法的に
おかしいと思うのです。実際に簡単なテストプログラムで同様なことをやると二重宣言としては
じかれます。それなのに許すというのはおかしくはないでしょうか?
#2:textBackColorの値を見ると、constを入れようが入れまいが同じ値が表記されます。です
から、同じ値がCreateSolidBrushに渡されます。それなのに何故、背景が変わるのでしょう
か。
どうぞ宜しくお願いします。
Win2K, VC++6.0, MFCです。
すみません。
無線LANが不安定で、同じものを何回か送信してしまったようです。
以後気をつけます。
②のほうはコンストラクタ内のローカル変数が(メンバとは別に)できてしまってます。
// メンバは同名のローカル変数によって隠されます。
背景色、文字色は別のところで指定しているのでしょう。
そのときに変数textBackColorやbackColorを使用していると思うのですが、
2のほうではそれはコンストラクタ内で初期化したものとは別物です。
textBackBrush、backBrushは正しく作成されているでしょう。
PAI様、
ありがとうございました。
仰る通りでした。
const textBackTextColorと宣言することにより、新たに変数が生成された、ということです
ね。
どうも変数の(オブジェクト)のスコープについての理解がいまいちだと分かりました。
すみませんでした。
一応参考までに、
const なメンバをコンストラクタで初期化するには
『コンストラクタ初期化子』を使用します。
機会があれば調べてみてください。