天天看點

VC 對話框背景顔色、控件顔色

系統環境:Windows 7

軟體環境:Visual C++ 2008 SP1

本次目的:為對話框設定背景顔色、控件顔色

      既然MFC對話框不好開發,那麼現在我們來開始美化我們的對話框。為對話框設定背景顔色、控件顔色等等。

對話框背景顔色:

網上流傳有四種方法(可能還不止),在VC++2008SP1測試後,發現隻有三種可以使用了,其中第一種被廢棄了。以下是四種方法:

方法一 (失效):調用CWinApp類的成員函數SetDialogBkColor來實作。     

  其中函數的第一個參數指定了背景顔色,第二個參數指定了文本顔色。下面的例子是将應用程式對 話框設定為藍色背景和紅色文本,步驟如下:     

  ①   建立一個基于Dialog的MFC   AppWizard應用程式ExampleDlg。     

  ②   在CExampleDlgApp   ::InitInstance()中添加如下代碼:     

BOOL   CExampleDlgApp:   :   InitInstance   (   )    

  {    

  …      CExampleDlgDlg   dlg;    

          m_pMainWnd   =   &dlg;    

          //先于DoModal()調用,将對話框設定為藍色背景、紅色文本    

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

          int   nResponse   =   dlg.DoModal();    

  …}   

 編譯并運作,此時對話框的背景色和文本色已發生了改變。值得注意的是:在調用DoModal()之前必須先調用SetDialogBkColor,且此方法是将改變應用程式中所有的對話框顔色,并不能針對某一個指定的對話框。     

方法二 :重載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();    

         }    

   }  

方法三 :重載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)      

    /*   

    **   這裡不必編寫任何代碼!   

    **下行代碼要注釋掉   

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

    */    

    return   m_brush;       //返加綠色刷子    

方法四 :還是重載OnCtlColor   (CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor),即WM_CTLCOLOR消息。具體步驟如下(以上例工程為準):     

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

  步驟③利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時則有些不同:     

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

    //在這加一條是否為對話框的判斷語句    

    if(nCtlColor   ==CTLCOLOR_DLG)    

    return   hbr;    

  }  

VC 對話框背景顔色、控件顔色

控件顔色:

對于分布在對話框上的控件,我們可以修改其顔色、其背景顔色,比如對靜态文本、文本編輯框、清單框等等。

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

步驟③:利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時則有些不同:

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

{  

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

    if(nCtlColor   ==CTLCOLOR_DLG)      //對話框顔色  

      return   m_brush;       //返加綠色刷子    

    if(nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC)  //靜态文本顔色,并且指定控件ID号  

    {  

         pDC->SetTextColor(RGB(255,0,0));  

         pDC->SetBkColor(RGB(191,219,255));     //靜态控件的背景顔色設定,這裡設定于背景顔色一緻,則可以免設定透明  

         //pDC->SetBkMode(TRANSPARENT);    //模式設定透明的話,則忽略靜态控件的背景顔色設定,與對話框顔色融合  

         hbr=(HBRUSH)m_brush;  

    }  

    if(nCtlColor==CTLCOLOR_EDIT)    //文本編輯框顔色  

        pDC->SetTextColor(RGB(0,0,255));   

        //pDC->SetBkColor(RGB(191,219,255));     //靜态控件的背景顔色設定  

        pDC->SetBkMode(TRANSPARENT);  

        hbr=(HBRUSH)m_brush;  

    }     

    return hbr;  

}  

效果如下:

VC 對話框背景顔色、控件顔色

對于其中nCtlColor類型,即它的取值:

CTLCOLOR_DLG   對話框  

CTLCOLOR_EDIT   編輯框  

CTLCOLOR_LISTBOX   清單框    

CTLCOLOR_MSGBOX   消息框  

CTLCOLOR_SCROLLBAR   滑動條  

CTLCOLOR_STATIC   靜态文本框、矩形等。