アトリエ ぺっぺ

トップページ > プログラムTips > ダイアログの背景色を変更する

◆ ダイアログの背景色を変更する
ダイアログの背景色を変更するには、CDialogクラスのOnCtlColor()メソッドをオーバーライドします。
 
ダイアログの背景を塗りつぶすには、色が設定されているブラシのハンドルが必要になるので、まずそのブラシを作成します。
以下に手順を示します。
 
@背景色を変更するダイアログクラスに、(もしまだ存在しなければ)デストラクタと、CBrushクラスのメンバを追加する
class CMyDlg : public CDialog
{
// 構築
public:
    CMyDlg(CWnd* pParent = NULL);    // 標準のコンストラクタ
    virtual ~CMyDlg();
    //    :
    //    省略
    //    :
    CBrush    m_cBkBrs;
};
Aダイアログのコンストラクタに上記で作成したブラシの中身を作成、デストラクタに破棄するコードを追加
#define COL_BACK    RGB(255, 255, 255)    // 背景色

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CMyDlg)
        // メモ: この位置に ClassWizard によってメンバの初期化が追加されます。
    //}}AFX_DATA_INIT

    // 背景色作成
    m_cBkBrs.CreateSolidBrush(COL_BACK);
}

CMyDlg::~CMyDlg()
{
    // 背景色用ブラシオブジェクト開放
    m_cBkBrs.DeleteObject();
}
次に、ClassWizardでOnCtlColor()メソッドをオーバーライドします。

 
最後に、OnCtlColor()を実装します。
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // ダイアログの背景色を変更
    if (pWnd == this){
        
        hbr = (HBRUSH)m_cBkBrs;
    }
    return hbr;
}
OnCtlColor()メソッドは、ダイアログ又はダイアログ内のコントロールの背景を塗りつぶすときに呼ばれます。
これを利用して、コントロールの背景色も同様に変更することができます。
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // リソースID(例ではIDC_BUTTON)から、コントロールへのポインタを取得
    CWnd* pBtn = GetDlgItem(IDC_BUTTON);
    // もし背景色を要求されているウィンドウが色を変えたいコントロールなら、
    // 背景色を変更
    if (pWnd == pBtn){
        
        hbr = (HBRUSH)m_cBkBrs;
    }
    return hbr;
}
また、OnCtlColor()メソッドの第三引数であるnCtlColorには色を変えたいコントロールの種類が設定されてくるので、この値を使用してコントロールごとに色をそろえることも可能です。
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    // ボタンの背景色を変更
    if(nCtlColor == CTLCOLOR_BTN){
        hbr = (HBRUSH)m_cBkBrs;
    }
}
 
ヘルプによると、以下の定数がnCtlColorに入ってくるようです。
CTLCOLOR_BTN
    ボタン コントロール
CTLCOLOR_DLG
    ダイアログ ボックス
CTLCOLOR_EDIT
    エディット コントロール
CTLCOLOR_LISTBOX
    リスト ボックス コントロール
CTLCOLOR_MSGBOX
    メッセージ ボックス
CTLCOLOR_SCROLLBAR
    スクロール バー コントロール
CTLCOLOR_STATIC
    スタティック コントロール 
ダイアログの背景色を変える場合は、ポインタを比較するのではなくて、この定数を使った方法のほうがいいかもしれません。
 

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp