`

自绘按钮补遗

    博客分类:
  • VC
阅读更多

自绘按钮补遗
作者:杜修杏

下载本文配套源代码 
(包括:改进后的CXPButton类、练习程序、练习程序答案)

《自绘按钮的实现》一文中所示范的CXPButton按钮从形状上看可以说是一个不规则按钮。我们把MFC中提供的控件成为标准控件,而其中的按钮控件则可称为规则按钮,因为它是的形状是一个规则的矩形。但是随着流线型设计在界面设计中被广泛采用,越来越多的程序设计者都乐意在自己的作品中加入一些非规则形状的控件。以按钮为例,最简单的就到有圆形按钮,三角按钮等。下图是一组定义好的圆形按钮:

 

但是这些在我们眼中似乎呈现出不规则形状的按钮,有时候的表现却不近乎人意。以之前设计的CXPButton为例,下面我们就来找找它的缺陷。我们把对话框的背景色改为其它颜色,看看会有什么效果。修改背景色的方法如下:为对话框类添加WM_ERASEBKGND消息,如果你在类向导中找不到该消息,请参考《自绘按钮的实现》中介绍的方法,注意在添加对话框中要把Filter for messages available to设为Child Window才能在列表中看到WM_ERASEBKGND消息。我们在函数中添加绘制背景色的代码:

BOOL CXPButtonDemoDlg::OnEraseBkgnd(CDC* pDC) 
{
	BOOL retValue= CDialog::OnEraseBkgnd(pDC);
	
	CRect rc;
	GetClientRect(&rc);
	pDC->FillSolidRect(&rc,RGB(0,0,255));
	
	return retValue;
}
编译后运行程序,可以看到下面的效果,在按钮的四个角上出现了难看的边角,这就是我所说的缺陷了:

 

既然发现了问题,下面当然就是动手来解决问题的时间了。在《自绘按钮的实现》一文中曾经讲过,按钮的绘制主要在DrawItem()函数中完成。这里要补充一点就是DrawItem()是MFC所提供的系统函数,所以可以通过下图的方法添加。选择Add Virtual Function…之后在弹出对话框左边的列表中找到DrawItem,选择Add and Edit即可。

 

好了,我们接着上面的话题。要解决按钮显示的“残角”问题,在这里需要使用一个叫做CRgn的类,这个类在创建不规则控件的时候经常要用到,我们可以通过CRgn类来设置控件的有效区域。那么什么是有效区域呢?以圆形按钮为例,MFC默认的按钮形状是矩形的,为了实现圆形按钮的效果,我们希望能够把原来矩形的四角裁剪掉,只保留中间的圆形区域。这种关系可以用下图来表示:



图中的A是原来的矩形区域,B是需要裁剪的区域,而C是有效区域。我们希望程序不要把B看作按钮的一部分,当鼠标在B上面点击的时候不要产生任何效果。设置按钮的有效区域一般是在PreSubclassWindow()函数里面实现的:
void CXPButton::PreSubclassWindow() 
{
	CButton::PreSubclassWindow();
	ModifyStyle(0, BS_OWNERDRAW);

	//设置按钮的有效区域
	CRgn rgn;
	CRect rc;
	GetClientRect(&rc);

	//有效区域为一个角半径为5的圆角矩形
	rgn.CreateRoundRectRgn(rc.left,rc.top,rc.right,rc.bottom,5,5);

	SetWindowRgn(rgn,TRUE);
	rgn.DeleteObject();
}
编译后运行程序,我们发现尽管已经设置了按钮的有效区域,但是问题还是没有解决,这是为什么呢?前面我们曾经通过对话框的WM_ERASEBKGND消息函数来改变对话框的底色,其实按钮也有它的WM_ERASEBKGND消息函数,它会使用系统颜色根据控件的默认形状来绘制控件的底色。所以我们要重载按钮的WM_ERASEBKGND消息函数,让它什么都不做:
BOOL CXPButton::OnEraseBkgnd(CDC* pDC) 
{
	//禁止绘制底色	
	return TRUE;
}
再编译一次,运行后发现,难看的"残角"不见了:

 



《自绘按钮的实现》一文中还讲过在DrawItem()函数中应该先画底色,其实这是有前提的,前提就是你已经知道了按钮所在对话框所使用的背景色,你可以使用这个颜色作为按钮的底色来进行填充。这样即使程序会在WM_ERASEBKGND消息函数中使用系统颜色来绘制控件的底色,但是等到它执行DrawItem()的时候,马上又会把之前的矩形底色覆盖,从而不留痕迹地把“残角”掩盖掉。
在本篇开头列举的圆形按钮中也有类似的问题,大家不防把它作为练习,看看是否能够解决圆形按钮中的“残角”问题。我在本篇提供的练习程序中需要修改的地方会表明“提示”的字眼,大家可以先把源程序中有“提示”字眼的地方找出来,再根据提示的内容进行修改。

 

最后还要补充的是各位对CRgn类的关注。在VC中,要创建出各种复杂形状的控件、窗口经常要依靠CRgn类的强大功能来实现。如果你想在界面设计这个环节更进一步的话,建议你抽点时间仔细研究一下Msdn中关于CRgn类的使用说明。如果你有什么好的使用经验和心得,不防把相关资料发到我的邮箱。以后有机会的话我会专门写一篇文章探讨一下CRgn类的使用技巧的。

分享到:
评论

相关推荐

    商业编程-源码-本代码是《自绘按钮补遗》一文的配套源代码.zip

    本案例提供的压缩包"商业编程-源码-本代码是《自绘按钮补遗》一文的配套源代码.zip",其内容是与一篇名为《自绘按钮补遗》的技术文章紧密相关的,这篇文章可能是对如何自定义绘制按钮及其补充细节的深入探讨。...

    1376.2规约6号补遗

    首先,补遗公告中对送检样品的有关要求做了补充,强调自2017年12月11日起,送检的宽带载波通信单元和微功率无线通信单元需具备停电主动上报功能。这是指当供电中断时,通信单元应能够及时通知采集主站,以便进行相应...

    DLT6452007第2号补遗

    关于第一批送样检测的两种智能电能表继续送样公告第2号补遗(2010-01-18) 为规范送检电能表通信规约及安全认证的相关内容,特作出如下规范。送检电能表需按照(略)

    论文研究-基于GPS实时数据的在线过滤与补遗研究.pdf

    为提高GPS数据的有效性与可靠性,使之为实现实时交通流量预测与交通诱导服务,首先基于GPS历史数据,以变异系数极小化为优化目标进行GPS数据过滤模型的优选,并对实时数据缺损提出两种补遗算法;然后给出基于动态GPS...

    电科院资料补遗文件

    ### 电科院资料补遗文件关键知识点解析 #### 一、背景介绍 - **文件来源**:国网计量中心发布的一份关于电能表全性能试验检测的补遗公告,时间为2014年。 - **主要内容**:针对最新的国家标准和技术要求,对智能...

    基于GPS实时数据的在线过滤与补遗研究.pdf

    《基于GPS实时数据的在线过滤与补遗研究》是一篇探讨如何提高GPS数据质量和可靠性的学术论文。文章主要关注在智能运输系统(ITS)中,如何利用GPS数据进行实时交通流量预测和交通诱导服务。作者包括米葛晓锋、曹斌、...

    专业技能字典市场研究补遗.doc

    专业技能字典市场研究补遗.doc

    Symantec Backup Exec 2012__SP2 管理指南补遗-14.pdf

    Symantec Backup Exec 2012 SP2 管理指南补遗 Symantec Backup Exec 2012 SP2 管理指南补遗是一份详细的管理指南,旨在帮助用户更好地使用 Symantec Backup Exec 2012 SP2 软件。该指南包含了对 Symantec Backup ...

    珍珠囊补遗药性赋.doc

    《珍珠囊补遗药性赋》是一份元代医学文献,由李东垣撰写,主要阐述了中药的药性和用途。这份文档分为三个卷,详细介绍了各类药物的性质、功效和适用症,对于理解中药的特性及其在治疗疾病中的作用具有重要价值。 ...

    清除MY123重点补遗

    【清除MY123重点补遗】主要涉及的是如何处理MY123这一类的恶意程序,这是一种典型的明星级流氓程序,对用户的计算机系统安全构成威胁。MY123不仅难以卸载,还具备自我复制和恢复的能力,使得常规的删除方法往往无效...

    二实用计算机软硬件知识补遗PPT课件.ppt

    二实用计算机软硬件知识补遗PPT课件.ppt

    某小型病险水库除险加固工程施工招标补遗.doc

    本文档涉及的具体对象为武宁县永红水库的除险加固工程,作为施工招标过程中的补遗文件,详细阐述了因工程量清单变动而引发的招标条件变更,这一变更对于确保工程顺利进行以及投标企业制定投标策略具有重要影响。...

    银行业务与信息化系统分析补遗可用.pdf

    银行业务与信息化系统分析补遗可用 本文对银行业务与信息化系统进行了全面的分析和补遗,涵盖了银行业务发展动态、银行IT系统、银行业务系统、管理信息系统等方面的知识点。 银行业务发展动态 银行业务发展动态是...

    TCP/IP学习笔记补遗

    《TCP/IP学习笔记补遗》是对TCP/IP协议族的深入理解和实践后的补充材料,旨在帮助读者更好地理解这个复杂的通信协议体系。TCP/IP是互联网的基础,它由四个主要层次构成:应用层、传输层、网络层和数据链路层。下面...

    银行业务与信息化系统分析补遗.pdf

    银行业务与信息化系统分析补遗.pdf 本资源是一个关于银行业务和信息化系统的分析补遗文档,涵盖银行业务的各个方面,包括银行业发展动态、银行中间业务、银行IT系统、银行业务系统、管理信息系统等。下面是本资源的...

    读书笔记:《Netty最佳实践》——《Netty实战》补遗.zip

    读书笔记:《Netty最佳实践》——《Netty实战》补遗

    基建工程质量控制作业标准(WHS)应用补遗说明.pdf

    基建工程质量控制作业标准(WHS)应用补遗说明.pdf

    玩转无线网络秘笈:无线路由器常见问题集锦补遗.pdf

    玩转无线网络秘笈:无线路由器常见问题集锦补遗.pdf

    9930 写号教程 ----总结补遗.pdf

    在深入了解“9930写号教程----总结补遗”之前,需掌握以下基础概念: - **EVDO**(Evolution-Data Optimized):一种3G无线宽带网络技术,用于高速数据传输,常用于黑莓等智能设备。 - **写号**:指的是将运营商...

Global site tag (gtag.js) - Google Analytics