如何在EVC中定制位图按钮

 

前言:本文适合于对EVC开发处于入门级的同志以及想了解及正在为这个EVC的按钮显示位图而烦恼的同志,如果是高手或者早已经了解的同仁就多提提宝贵意见了,在下篇文章还要在该位图按钮上加载菜单,响应菜单单击的消息映射,由于时间有限就分开讲解了。

摘要:

自从本人接触EVC以来,解决了很多小问题,最近确实感觉太忙了,以至于很多想法都没有时间来整理,今天也是趁了中午这个时间来稍微写写自己的心得。在解决这个问题之前,我曾经查阅过许多的资料,当然也接触多许多的优秀的代码,如大名鼎鼎的CButtonSTVC6等环境)和它的相对应的EVC的版本CCeButtonSTvc6的版本感觉很优秀了,用在我们的开发中也很足够了,但是感觉EVC的版本还是不够理想,我是从CodeProject上下载的,不知道是不是最新的)以及CUniButton CButtonStyle等。本人最后的做法是自己重写了一个按钮类,实现了自己的功能。

       当然,在EVC中有个CBitmapButton类,用过的同志就知道有点不爽,不管是鼠标点击下去还是弹起来都不舒服,因为没有什么视觉效果。而且它似乎只能表示两种状态,尽管它还有个DISABLE参数,但是平时没啥用。

下面是主要的步骤,主要是思想的介绍,最后我会提供我的这个按钮类以及下载过的一些按钮类的地址,供大家学习,懂得了原理我们就可以以不变应万变了。

步骤:

1.新建一个类,如CMenuButton继承自CButton,然后重载DrawItem方法和PreSubclassWindow。这里因为我们自绘,所以必须要重写DrawItem方法,如果我们的按钮一旦设置了BS_OWNERDRAW风格的话,GDI就会调用此函数来绘制按钮。PreSubclassWindow的含义大致从函数名就能猜出来,意思是说主窗体你先不要出来,我这里继承了一个新的按钮类,我要先被调用。

2.向按钮中添加消息映射,并写入你自己的一些是实现手段,如鼠标按下的时候绘制一个什么图形,弹起的时候绘制什么图形等等。

如:

BEGIN_MESSAGE_MAP(CMenuButton, CButton)

       //{{AFX_MSG_MAP(CMenuButton)

              ON_WM_LBUTTONDOWN()

              ON_WM_LBUTTONUP()

              ON_WM_MOUSEMOVE()

ON_WM_KILLFOCUS()

       //}}AFX_MSG_MAP

END_MESSAGE_MAP()

注:这里最主要要注意的是ON_WM_KILLFOCUS()消息映射,这个的主要功能是当我们鼠标离开的时候我们需要将按钮进行还原,恢复正常状态。

3.向按钮中添加位图资源。经过上两步,一个我们自绘的按钮的模型就已经出来了,剩下的就是再提供一个接口,用来加载外部的位图资源以便在我们需要的时候进行加载。我们可以声明如下函数:void SetBtnBitmap(UINT nBitmapResources,UINT nBitmapResourcesUp,UINT nBitmapResourceDown);其中三个参数分表代表正常,弹起、按下的三种状态位图资源ID。添加完毕后,我们就可以在DrawItem中进行加载位图了。

恩,基本上就这些了,可能有一些细节方面没有讲到,但是自己看看代码就一目了然了。我强烈推荐各位新手重写,知其然而且知其所以然,正像侯俊杰先生说的,MFC入门很容易,但是要达到高屋建瓴,胸有成竹的程度却几乎是一个近乎九十度直角的学习线路。本人是从C#迁移过来开始学习MFC的,感觉就很恶心,因为这里面大量的宏,消息映射和doc/view架构使得我浑然不知所措,根本找不到一个很明确的方向和路线,所以还需要再努力啊。
---------------------------------------------------------------------------------------------------------------------------------
//本人所写的按钮类,在EVC4.2下和VC6下调试通过。
1./Files/jsjkandy/BtnMenu.rar
//===下面是一些供下载的按钮类(只提供了网址)==================
2.CButtonST(VC6):http://www.codeproject.com/KB/buttons/cbuttonst.aspx
 CCeButtonST v1.2(EVC4.2):http://www.codeproject.com/KB/mobile/ccebuttonst.aspx
3.CButtonSSLhttp://www.codeproject.com/KB/buttons/cbuttonssl.aspx

最后:
本人在做这个界面的时候,有个问题到现在还没有解决,就是关于透明按钮的实现原理,查阅过很多资料,同时上面的CButtonST也有透明处理的实现过程,但是去我却还是搞不清楚其原理与实现机制,有些说是用CDC进行位处理进行异或运算,即消除按钮的的那个灰色或者白色背景,但是效果不理想,有很多的锯齿,如果在ctl_COlor里面进行处理的话,它就不能透明到指定的对话框下面,他就透明到后面的背景去了,而且一旦指定了own_draw,就啥都没有用了。这里提出这个问题算是询问下。有研究过的给个方向。

转载于:https://www.cnblogs.com/hanchan/archive/2008/04/09/1144854.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值