constとstatic textの表示 – プログラミング – Home

通知
すべてクリア

[解決済] constとstatic textの表示


Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

いつもお世話になります。
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です。


引用未解決
トピックタグ
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

すみません。
無線LANが不安定で、同じものを何回か送信してしまったようです。
以後気をつけます。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

②のほうはコンストラクタ内のローカル変数が(メンバとは別に)できてしまってます。
// メンバは同名のローカル変数によって隠されます。

背景色、文字色は別のところで指定しているのでしょう。
そのときに変数textBackColorやbackColorを使用していると思うのですが、
2のほうではそれはコンストラクタ内で初期化したものとは別物です。

textBackBrush、backBrushは正しく作成されているでしょう。


返信引用
Beginner
 Beginner
(@Beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

PAI様、

ありがとうございました。
仰る通りでした。
const textBackTextColorと宣言することにより、新たに変数が生成された、ということです
ね。
どうも変数の(オブジェクト)のスコープについての理解がいまいちだと分かりました。
すみませんでした。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

一応参考までに、
const なメンバをコンストラクタで初期化するには
『コンストラクタ初期化子』を使用します。

機会があれば調べてみてください。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました