VC++ 中改变对话框及相关控件的背景色(MFC)

 

最近在研究在VC++中自定义自己喜欢的窗体及控件背景色,在网上找到相关的信息,摘录如下,以及自己的实际实验结果:

 


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

---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。
下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下:

 

  1. ---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。   
  2.   
  3. ---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:   
  4.   
  5. BOOL CExampleDlgApp: : InitInstance ( )  
  6. {  
  7. …  
  8. CExampleDlgDlg dlg;  
  9. m_pMainWnd = &dlg;  
  10.   
  11. //先于DoModal()调用,将对话框设置为蓝色背景、红色文本   
  12. SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));  
  13. int nResponse = dlg.DoModal();  
  14. …  
  15. }  

---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的
是:在调用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.   
  12. CDialog::OnPaint();  
  13. }  



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

 

  1. ---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:   
  2.   
  3. class CExampleDlgDlg : public CDialog  
  4. {  
  5. ...  
  6. protected:  
  7. CBrush m_brush;   
  8. ...  
  9. };  
  10.   
  11.   
  12. ---- ②在OnInitDialog()函数中添加如下代码:   
  13. BOOL CExampleDlgDlg::OnInitDialog()   
  14. {  
  15. ...  
  16. // TODO: Add extra initialization here   
  17. m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子 要放在诸如SetWindowText();   
  18. ShowWindow(SW_SHOWMAXIMIZED); 等显示函数之前,才能见到绿色画刷的效果  
  19. ...  
  20. }   
  21.   
  22. ---- ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:   
  23. HBRUSH CExampleDlgDlg::OnCtlColor  
  24. (CDC* pDC, CWnd* pWnd, UINT nCtlColor)   
  25. {  
  26. /* 
  27. ** 这里不必编写任何代码! 
  28. **下行代码要注释掉 
  29. ** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
  30. */  
  31.   
  32. return m_brush; //返回绿色刷子   
  33. }  



---- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),
即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):
---- 步骤①、②同上方法三中的步骤①、②。

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

  1. HBRUSH CExampleDlgDlg::OnCtlColor  
  2. (CDC* pDC, CWnd* pWnd, UINT nCtlColor)   
  3. {  
  4. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  5.   
  6. //在这加一条是否为对话框的判断语句   
  7. if(nCtlColor ==CTLCOLOR_DLG)  
  8. return m_brush; //返回绿色刷子   
  9. return hbr;  
  10. }  

---- 编译并运行即可。
---- 关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,
在这仅举出四种常见的方法。其中方法三的编程似乎有点不太规范,方法四则
要比方法三正统些。

 

 


 

另外:设置背景位图:

 

 

  1. CBitmap m_bmpBackground;  
  2.   
  3. m_bmpBackground.LoadBitmap(IDB_BACKGROUND);  
  4.   
  5. OnPaint()  
  6.   
  7. {  
  8.   
  9. CBkDialog::OnPaint();  
  10.     /*  
  11.     CPaintDC dc(this);      //对话框的dc   
  12.     CDC dcMem;   
  13.     dcMem.CreateCompatibleDC(&dc);     //创建与对话框dc兼容的内存dc   
  14.   
  15.     CRect rect;  
  16.     GetClientRect(&rect);  
  17.   
  18.     BITMAP bitMap;  
  19.     m_bmpBackground.GetBitmap(&bitMap);  
  20.   
  21.     CBitmap *pbmpOld=dcMem.SelectObject(&m_bmpBackground);    //将背景位图选入内存dc中   
  22.     dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);     //将内存dc中的位图拉伸显示在对话框的dc中   
  23.     //dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);  

 


 

下面的代码是我在我的实际程序中用到的代码(使用上面的第四种方法):

 

 

  1. //创建画刷的对象   
  2. CBrush m_bkbrush;  

 

[c-sharp] view plain copy print ?
  1. BOOL CScreenLockDlg::OnInitDialog()  
  2. {  
  3.     CDialog::OnInitDialog();  
  4.   
  5.     // 将“关于...”菜单项添加到系统菜单中。   
  6.   
  7. ...........  
  8.     // TODO: 在此添加额外的初始化代码   
  9.   
  10.     m_bkbrush.CreateSolidBrush(RGB(0,0,0));  
  11.   
  12.     SendDlgItemMessage(IDC_UNLOCK,EM_SETREADONLY,1);    //初始化解锁框为只读   
  13.   
  14.     SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);    //设置前端显示   
  15.   
  16.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE   
  17. }  

 

 

  1. //对话框及控件背景颜色设置   
  2. HBRUSH CScreenLockDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
  3. {  
  4.   
  5.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  6.   
  7.     if(nCtlColor==CTLCOLOR_EDIT)  
  8.     {    
  9.         return NULL;  
  10.     }  
  11.     if(nCtlColor==CTLCOLOR_STATIC)  
  12.     {   
  13.         pDC->SetTextColor(RGB(90,125,207));  
  14.         pDC->SetBkMode(TRANSPARENT);  
  15.         return m_bkbrush;  
  16.     }  
  17.     //设置对话框Dialog的背景颜色   
  18.     if(nCtlColor   ==CTLCOLOR_DLG)  
  19.     {  
  20.         return m_bkbrush;  
  21.     }  
  22.   
  23.     return hbr;  
  24. }  

 

经测试,方法完全可行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值