小徐技术库(
网学)贡献
本资料由-校园大学生创业网-提供 chuangyw/
创建有个性的对话框之 MFC 篇
想使自己的软件与众不同就要给
软件加点“色”, 一个颜色搭配协调的窗口 要比 windows 千篇一律的灰底黑字更能吸引别人的眼球。设想如果 html 浏览器 显示的网页都是白底黑字,还会有那么多的 mm 喜欢上网吗?可能互联网的人气 将下降一半。做个出色的界面对于老手来说可能不在话下,但是对于新手来说还 是无从下手,使用 BCGControlBar 和 Xtreme Toolkit 是个很好的选择,不过对 于一个小程序使用这么大的库未免有头重脚轻的感觉。 其实不使用这些庞然大物 一样可以做个很“色”的界面,本文就结合 CSDN 论坛上经常被问起的问题,介 绍几个给对话框上色的方法。本文的方法都是针对 MFC 程序的,其他方法请参看 “创建有个性的对话框之 ATL/WTL 篇”。 第一步:改变对话框的背景颜色 如何改变对话框的背景颜色这个问题常常出现在论坛上,可见大家对 Windows 默认的灰色对话框是多么不满。MFC
程序修改对话框的背景和文字颜色 最简单的方法就是调用 SetDialogBkColor 函数,SetDialogBkColor 是 CWinApp 类的成员函数,以下是该函数的原型: void CWinApp::SetDialogBkColor(COLORREF clrCtlBk, COLORREF clrCtlText); 请注意,SetDialogBkColor 函数并不是对 Windows 的某个 API 的封装,他 是 MFC 框架的一部分,所以不使用 MFC 的程序也就不能享受这种方便。这个函数 的使用很简单,在程序的 CWinApp 派生类的 InitInstance 函数中添加一行代码 就行了: SetDialogBkColor(RGB(188,197,230),RGB(13,125,188)); 图.1 就是运行效果:
在线代理 dailiav/提供部分资料
本资料由-校园大学生创业网-提供 chuangyw/
图.1 SetDialogBkColor 效果图 使用 SetDialogBkColor 也有局限的地方,那就是所有的控件文字颜色都一 样,不能针对不同的控件设置不同的文字颜色,还有就是不能设置 Edit 控件的 颜色。不使用 SetDialogBkColor 函数,直接编写代码控制对话框的背景颜色和 控件文字颜色也不是很困难的事情, 并且这种方法能够提供更灵活的颜色设置方 案,比如对不同类型的控件使用不同的文字颜色,使用高亮度的背景颜色突出某 个控件等等,最重要的是能够控制 Edit 控件的文字和背景颜色,下面就介绍这 种方法。 首先是改变对话框的背景颜色。 Windows
系统需要重画某个窗口客户区的 当 背景的时候,就会向该窗口发送 WM_ERASEBKGND 消息,窗口的处理过程响应这 个消息重新画窗口的背景,这个过
程称之为“自画”。改变对话框的背景颜色的 原理很简单,就是响应这个消息,用自定义的颜色填充对话框的客户区背景,代 替对话框窗口默认的背景填充动作。许多新手经常问:“为什么在 class wizard 中找不到对话框的 WM_ERASEBKGND 消息, 是不是对话框没有这个消息”?其实对 话框也是窗口,它也有 WM_ERASEBKGND 消息,只是 MFC 的 class wizard 使用的 dialog 过滤器将其过滤掉了(只是在 message 窗口的显示中过滤了,并不是真 的不响应这个消息) 为的是代码编写过程中突出对话框专有的消息和控件事件。 , 如图.2 所示,只要在 class wizard 中的“class info” table 标签下将消息 过滤器改成 Windows 就可以在对话框的消息列表中看到 WM_ERASEBKGND 了。
图.2 修改消息过滤器 现在通过 class wizard 添加 WM_ERASEBKGND 的消息响应函数,并如下所示 修改这个函数:
在线代理 dailiav/提供部分资料
本资料由-校园大学生创业网-提供 chuangyw/
BOOL CCustDlgDlg::OnEraseBkgnd(CDC* pDC) { CRect rcClient; GetClientRect(&;rcClient); pDC->FillRect(&;rcClient,&;m_brBkgnd); return TRUE; //return CDialog::OnEraseBkgnd(pDC); } m_brBkgnd 是个 CBrush,在此之前已经初始化过