天天看點

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會好一點。