zoukankan      html  css  js  c++  java
  • VC 对话框背景颜色、控件颜色

    系统环境:Windows 7
    软件环境:Visual C++ 2008 SP1
    本次目的:为对话框设置背景颜色、控件颜色

          既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框。为对话框设置背景颜色、控件颜色等等。

     


    对话框背景颜色:

     

    网上流传有四种方法(可能还不止),在VC++2008SP1测试后,发现只有三种可以使用了,其中第一种被废弃了。以下是四种方法:

    方法一 (失效):调用CWinApp类的成员函数SetDialogBkColor来实现。     
      其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对 话框设置为蓝色背景和红色文本,步骤如下:     
      ①   新建一个基于Dialog的MFC   AppWizard应用程序ExampleDlg。     
      ②   在CExampleDlgApp   ::InitInstance()中添加如下代码:     
     

    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消息。有关代码如下(以上例工程为准):    

    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的成员变量:     
     

    1. class   CExampleDlgDlg   :   public   CDialog    
    2.   {...    
    3.     protected:    
    4.     CBrush   m_brush;      
    5.     ...    
    6.   };   

      ②在OnInitDialog()函数中添加如下代码:     
      
    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消息:     
     
    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消息)时则有些不同:     
     
    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消息)时则有些不同:

    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   静态文本框、矩形等。

  • 相关阅读:
    CodeForces 706C Hard problem
    CodeForces 706A Beru-taxi
    CodeForces 706B Interesting drink
    CodeForces 706E Working routine
    CodeForces 706D Vasiliy's Multiset
    CodeForces 703B Mishka and trip
    CodeForces 703C Chris and Road
    POJ 1835 宇航员
    HDU 4907 Task schedule
    HDU 4911 Inversion
  • 原文地址:https://www.cnblogs.com/lidabo/p/3489620.html
Copyright © 2011-2022 走看看