创建有个性的对话框之MFC篇(一) - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- 创建有个性的对话框之MFC篇(一) (http://www.webasp.net/article/28/27698.htm) |
| -- 作者:未知 -- 发布日期: 2006-07-05 |
| 想使自己的软件与众不同就要给软件加点“色”,一个颜色搭配协调的窗口要比windows千篇一律的灰底黑字更能吸引别人的眼球。设想如果html浏览器显示的网页都是白底黑字,还会有那么多的mm喜欢上网吗?可能互联网的人气将下降一半。做个出色的界面对于老手来说可能不在话下,但是对于新手来说还是无从下手,使用BCGControlBar和Xtreme Toolkit是个很好的选择,不过对于一个小程序使用这么大的库未免有头重脚轻的感觉。其实不使用这些庞然大物一样可以做个很“色”的界面,本文就结合CSDN论坛上经常被问起的问题,介绍几个给对话框上色的方法。本文的方法都是针对MFC程序的,其他方法请参看“创建有个性的对话框之ATL/WTL篇”。
第一步:改变对话框的背景颜色 如何改变对话框的背景颜色这个问题常常出现在论坛上,可见大家对Windows默认的灰色对话框是多么不满。MFC程序修改对话框的背景和文字颜色最简单的方法就是调用SetDialogBkColor函数,SetDialogBkColor是CWinApp类的成员函数,以下是该函数的原型:
请注意,SetDialogBkColor函数并不是对Windows的某个API的封装,他是MFC框架的一部分,所以不使用MFC的程序也就不能享受这种方便。这个函数的使用很简单,在程序的CWinApp派生类的InitInstance函数中添加一行代码就行了:
图.1 就是运行效果:
图.1 SetDialogBkColor效果图 使用SetDialogBkColor也有局限的地方,那就是所有的控件文字颜色都一样,不能针对不同的控件设置不同的文字颜色,还有就是不能设置Edit控件的颜色。不使用SetDialogBkColor函数,直接编写代码控制对话框的背景颜色和控件文字颜色也不是很困难的事情,并且这种方法能够提供更灵活的颜色设置方案,比如对不同类型的控件使用不同的文字颜色,使用高亮度的背景颜色突出某个控件等等,最重要的是能够控制Edit控件的文字和背景颜色,下面就介绍这种方法。
图.2 修改消息过滤器 现在通过class wizard添加WM_ERASEBKGND的消息响应函数,并如下所示修改这个函数:
m_brBkgnd是个CBrush,在此之前已经初始化过了,关键代码是最后返回TRUE,而不是默认的调用基类函数,返回TRUE意在告诉Windows:“我已经画过背景了,你不要再画了”。现在来看看运行的效果:
图.3 重画背景的效果 使用位图作为对话框的背景也不难,就是在整个客户区画一个位图背景, 第二步:改变控件的颜色 看起来不如刚才效果好,控件文字的颜色和背景色都没有改变,这是因为我们还没有处理WM_CTLCOLOR消息。WM_CTLCOLOR是Windows的控件向其父窗口发送最频繁的通知消息之一,例如,许多控件发送WM_CTLCOLOR消息给父窗口,让父窗口提供画刷来画自己的背景。MFC的窗口类对这个通知消息特殊对待,如果父窗口没有处理这个通知消息,MFC的窗口类就根据WM_CTLCOLOR通知消息的来源将这个WM_CTLCOLOR消息发送回控件,让控件自己处理,这就是所谓的“消息反射”,不仅是WM_CTLCOLOR,MFC对很多通知消息都做了反射,不过我们今天的例子没有使用“消息反射”,我们在控件的父窗口,也就是对话框窗口处理这个通知消息。还有一点需要说明的是,WM_CTLCOLOR消息是16位的Windows平台的消息,在32位的Windows平台上取而代之的是一系列更明确的通知消息: WM_CTLCOLORBTN 按钮控件 MFC为了兼容性考虑,仍旧使用OnCtlColor响应这些消息,但是通过参数nCtlColor来具体的区分他们。在这个函数中,我们可以通过改变pDC参数的属性来改变控件的绘制,并返回相应的画刷句柄给控件,控件使用这个画刷画自己的背景。下面是我们修改后的OnCtlColor函数:
图.4 就是这段代码的效果,在这里我们不分“青红皂白”,向所有的控件返回我们自己的画刷,看起来不错,Edit控件的文字颜色也改了,但是好像多行Edit控件有了麻烦,看来需要对多行Edit控件特殊对待。
图.4 重载OnCtlColor之后的效果 对于多行Edit控件特殊处理,如下所示,上面的问题解决了:
上面的代码解决了IDC_EDIT_MULTI_LINE的问题,但是对每个多行Edit控件都要判断ID,下面的方法可以一劳永逸地解决多行编辑控件的问题:
|
| webasp.net |