VC 對話框背景顏色、控件顏色(三種方法)


系統環境:Windows 7
軟件環境:Visual C++ 2008 SP1
本次目的:為對話框設置背景顏色、控件顏色

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

 


對話框背景顏色:

 

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

方法一 (失效):調用CWinApp類的成員函數SetDialogBkColor來實現。     
  其中函數的第一個參數指定了背景顏色,第二個參數指定了文本顏色。下面的例子是將應用程序對 話框設置為藍色背景和紅色文本,步驟如下:     
  ①   新建一個基於Dialog的MFC   AppWizard應用程序ExampleDlg。     
  ②   在CExampleDlgApp   ::InitInstance()中添加如下代碼:     
 

[cpp]  view plain  copy
 
  1. BOOL   CExampleDlgApp:   :   InitInstance   (   )    
  2.   {    
  3.   …      CExampleDlgDlg   dlg;    
  4.           m_pMainWnd   =   &dlg;    
  5.           //先於DoModal()調用,將對話框設置為藍色背景、紅色文本    
  6.           SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));    
  7.           int   nResponse   =   dlg.DoModal();    
  8.   …}   


 編譯並運行,此時對話框的背景色和文本色已發生了改變。值得注意的是:在調用DoModal()之前必須先調用SetDialogBkColor,且此方法是將改變應用程序中所有的對話框顏色,並不能針對某一個指定的對話框。     
方法二 :重載OnPaint(),即WM_PAINT消息。有關代碼如下(以上例工程為准):    

 

 

[cpp]  view plain  copy
 
  1. void   CExampleDlgDlg::OnPaint()      
  2.   {    
  3.           if  (IsIconic())     
  4.             …    
  5.           else    
  6.          {    
  7.             CRect   rect;    
  8.             CPaintDC   dc(this);    
  9.             GetClientRect(rect);    
  10.             dc.FillSolidRect(rect,RGB(0,255,0));     //設置為綠色背景    
  11.             CDialog::OnPaint();    
  12.          }    
  13.    }  

 

方法三 :重載OnCtlColor   (CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor),即WM_CTLCOLOR消息。具體步驟如下(以上例工程為准):     
  ①在CExampleDlgDlg的頭文件中,添加一個CBrush的成員變量:     
 

[cpp]  view plain  copy
 
  1. class   CExampleDlgDlg   :   public   CDialog    
  2.   {...    
  3.     protected:    
  4.     CBrush   m_brush;      
  5.     ...    
  6.   };   


  ②在OnInitDialog()函數中添加如下代碼:     
  

[cpp]  view plain  copy
 
  1. BOOL   CExampleDlgDlg::OnInitDialog()      
  2.   {    
  3.     ...    
  4.     //   TODO:   Add   extra   initialization   here    
  5.     m_brush.CreateSolidBrush(RGB(0,   255,   0));   //   生成一綠色刷子      
  6.     ...    
  7.   }   


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

[cpp]  view plain  copy
 
  1. HBRUSH   CExampleDlgDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)      
  2.   {    
  3.     /*   
  4.     **   這里不必編寫任何代碼!   
  5.     **下行代碼要注釋掉   
  6.     **   HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);   
  7.     */    
  8.     return   m_brush;       //返加綠色刷子    
  9.   }   


方法四 :還是重載OnCtlColor   (CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor),即WM_CTLCOLOR消息。具體步驟如下(以上例工程為准):     
  步驟①、②同上方法三中的步驟①、②。     
  步驟③利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時則有些不同:     
 

[cpp]  view plain  copy
 
  1. HBRUSH   CExampleDlgDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)      
  2.   {    
  3.     HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);    
  4.     //在這加一條是否為對話框的判斷語句    
  5.     if(nCtlColor   ==CTLCOLOR_DLG)    
  6.     return   m_brush;       //返加綠色刷子    
  7.     return   hbr;    
  8.   }  

 

效果圖,在基於上一篇的位圖按鈕 ,看看是否與背景蠻和諧的:

 


控件顏色:

對於分布在對話框上的控件,我們可以修改其顏色、其背景顏色,比如對靜態文本、文本編輯框、列表框等等。

步驟①、②同上方法三中的步驟①、②。
步驟③:利用ClassWizard重載OnCtlColor(…)(即WM_CTLCOLOR消息)時則有些不同:

 

[cpp]  view plain  copy
 
  1. HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
  2. {  
  3.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  4.     if(nCtlColor   ==CTLCOLOR_DLG)      //對話框顏色  
  5.       return   m_brush;       //返加綠色刷子    
  6.     if(nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC)  //靜態文本顏色,並且指定控件ID號  
  7.     {  
  8.          pDC->SetTextColor(RGB(255,0,0));  
  9.          pDC->SetBkColor(RGB(191,219,255));     //靜態控件的背景顏色設置,這里設置於背景顏色一致,則可以免設置透明  
  10.          //pDC->SetBkMode(TRANSPARENT);    //模式設置透明的話,則忽略靜態控件的背景顏色設置,與對話框顏色融合  
  11.          hbr=(HBRUSH)m_brush;  
  12.     }  
  13.     if(nCtlColor==CTLCOLOR_EDIT)    //文本編輯框顏色  
  14.     {  
  15.         pDC->SetTextColor(RGB(0,0,255));   
  16.         //pDC->SetBkColor(RGB(191,219,255));     //靜態控件的背景顏色設置  
  17.         pDC->SetBkMode(TRANSPARENT);  
  18.         hbr=(HBRUSH)m_brush;  
  19.     }     
  20.     return hbr;  
  21. }  

 

效果如下:

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

CTLCOLOR_DLG   對話框  
CTLCOLOR_EDIT   編輯框  
CTLCOLOR_LISTBOX   列表框    
CTLCOLOR_MSGBOX   消息框  
CTLCOLOR_SCROLLBAR   滑動條  
CTLCOLOR_STATIC   靜態文本框、矩形等。

http://blog.csdn.net/akof1314/article/details/4952372


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM