天天看点

VC中改变对话框背景色的多种方法

VC中改变对话框背景色的多种方法

1. 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。

这种方法中,所有的对话框都是这个属性了。  

看下面代码:

BOOL CExampleDlgApp::InitInstance()

{

    ...

    CExampleDlgDlg   dlg; 

    m_pMainWnd   =   &dlg; 

    // DoModal()前调用,将对话框设置为蓝色背景、红色文本 

    SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); 

    int nResponse = dlg.DoModal(); 

    ...

此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。

此方法只在VC6中有效, 后面的版本都无效了

2. 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准):   

void CExampleDlgDlg::OnPaint()   

{

    if(IsIconic())

        ...

    else 

    { 

        CRect   rect; 

        CPaintDC   dc(this); 

        GetClientRect(rect); 

        dc.FillSolidRect(rect,RGB(0,255,0));     //设置为绿色背景  

        CDialog::OnPaint();

    }  

3. 方法三:重载OnCtlColor   (CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):   

①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:

class   CExampleDlgDlg   :   public   CDialog 

    ... 

protected: 

    CBrush   m_brush;   

    ... 

}; 

②在OnInitDialog()函数中添加如下代码:   

BOOL   CExampleDlgDlg::OnInitDialog()   

    ... 

    //   TODO:   Add   extra   initialization   here 

    m_brush.CreateSolidBrush(RGB(0, 255, 0));   //   生成一绿色刷子   

    ... 

}   

③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:   

HBRUSH   CExampleDlgDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)

    return   m_brush;       //返加绿色刷子 

4. 方法四:还是重载OnCtlColor   (CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):   

①、②同上方法三中的步骤①、②。   

③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有些不同:   

HBRUSH   CExampleDlgDlg::OnCtlColor 

(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)   

    HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor); 

    //在这加一条是否为对话框的判断语句 

    if(nCtlColor   ==CTLCOLOR_DLG) 

        return   m_brush;       //返加绿色刷子 

    return   hbr; 

5. 方法五:重载BOOL CExampleDlgDlg::OnEraseBkgnd(CDC* pDC) 函数

写入代码如下:

BOOL CExampleDlgDlg::OnEraseBkgnd(CDC* pDC)

{

    //return CDialog::OnEraseBkgnd(pDC);

        CRect rcClient;

    GetClientRect( &rcClient );

    pDC->SetBkColor( RGB(255, 255, 255) );

    pDC->ExtTextOut(0, 0, ETO_OPAQUE, &rcClient, NULL, 0, NULL);        // 注意这里一定要, 否则不能刷新

    return TRUE;

}

本人觉得方法 1, 2, 5都比较简单, 而方法1要视需求而定, 方法5应该效率上比方法2会好一点。