自绘按钮的实现

2016-01-29 12:04 182 1 收藏

自绘按钮的实现,自绘按钮的实现

【 tulaoshi.com - C语言心得技巧 】

自绘按钮的实现
作者:杜修杏

下载本文示例工程

如果你希望能够在自己的程序中表现出新意,那么你一定不会仅仅满足于MFC提供那些标准控件。这时,我们就必须自己另外多做些工作了。就改变控件外观这一点来说,主要是利用控件的自绘功能(Owner Draw)实现的。本篇将和各位一起定义一个XP风格的CXPButton按钮类,目的不在于介绍CXPButton类的使用技巧,而在于向各位阐述实现自绘按钮的方法。当然如果你觉得CXPButton有用的话,也可以把它的源文件保存下来,直接加入到自己的项目中。

本篇要点:
一、准备工作
二、实现原理及难点
三、按钮类的使用
四、小结与提示
五、附录

一、准备工作

在开始编码之前,首先应该确定好,更准确的说应该是设计好按钮在各种状态下的外观。按钮控件的几中基本状态包括:
Normal状态,就是按钮一开始显示时的样子。
Over状态,鼠标指针移动到按钮上面时按钮显示的样子。
Down状态,按下按钮时显示的样子。
Focus状态,按钮按下后松开的样子,例如标准按钮按下松开之后会看到按钮内部有一个虚线框。
Disable状态,当然就是按钮被设置成无效的时候的样子啦。

我参考了一下WindowsXP中普通按钮的实际样子,设计出XP按钮各种状态的外观,如下图所示:


至于Down状态主要是在Over状态的基础上将文字往右下的方向稍微平移,以实现下压的效果。

二、实现原理及难点

下面我们开始类的创建,在Workspace的ClassView页中右击列表树的根结点,选择New Class…



在弹出窗口中进行派生类的定义,如下图所示,注意,你需要填写的只有Name和Base class两项,其余的选项保持默认值就可以了。



按OK按钮退出之后,我们可以在ClassView里面看到新创建的类的名字。接下来我们可以为CXPButton类添加各种成员变量。因为自绘控件说穿了就是画图,所以在成员变量中可以看到各种与画图有关的数据类型,一般来说成员变量会在类的构造函数中初始化,在类的析构函数中销毁。详细代码请参见本篇附带的源程序。
下面简要叙述一下按钮的实现原理:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

1. 在控件初始化时为按钮添加Owner Draw的属性。这是因为在MFC中,要想激活控件的自绘功能,要求该控件的属性中必须包含属性值BS_OWNERDRAW,这一步我们可以通过类向导为CXPButton类添加PreSubclassWindow()函数,在该函数中完成属性值的设置。当激活控件的自绘功能之后,每次控件状态改变的时候都会运行函数DrawItem(),该函数的作用就是绘制控件在各种状态下的外观。

2. 添加WM_MOUSELEAVE消息函数,当鼠标指针离开按钮时,触发该消息函数,我们在函数中添加代码,通知DrawItem函数鼠标指针已经离开了,让按钮重绘。

3. 添加WM_MOUSEHOVER消息函数,当鼠标指针位于按钮之上时,触发该消息函数,我们在函数重添加代码,通知DrawItem函数鼠标指针现在正在按钮的上面,让按钮重绘。

4. 添加DrawItem函数。在DrawItem中根据按钮当前的状态绘制按钮的外观。可以说自绘控件的大部分功能都是在这个函数中实现的。DrawItem函数包含了一个LPDRAWITEMSTRUCT的指针,本篇会在稍后予以讲解。

了解了基本的设计思路之后,剩下就看我们怎么去实现了。我本人觉得这里有两个难点,首先是WM_MOUSELEAVE和WM_MOUSEHOVER不是标准的Windows消息函数,它们不能通过类向导来添加,所有的添加工作都需要通过手工输入代码来完成。另一个难点是DrawItem中的LPDRAWITEMSTRUCT指针,它指向了一个DRAWITEMSTRUCT的结构,这个结构中包含了控件的各种细节,为我们提供了实现自绘功能的必要信息。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

难点一:
事实上WM_MOU

来源:https://www.tulaoshi.com/n/20160129/1484458.html

延伸阅读
在微软的很多软件(如WORD)的工具栏中,都采用一种浮动按纽,即正常情况下按纽的图标呈灰色,当鼠标移动到某一按纽时,该按纽自动向上凸起且变为彩色,并在按纽的右下方有一标签提示该按纽的功能,鼠标移开后又自动还原,这种按纽用VB实现时,方法如下: 1.先用绘图工具作出按纽图标后存盘(如1.bmp),再用图象处理软件将该图标转换为灰度...
标签: PS PS教程
本文为中国合作伙伴印象特别供稿,转载必须取得 授权 本教程的主要目的是使用photoshop中的一些最基本的工具,绘制水晶效果图标。 所使用的主要工具有:“椭圆、矩形选框工具”、“椭圆、矩形工具”、渐变工具。 图层面板中的主要功能:样式、编组、图层混合模式,蒙板。 因为主要针对的对象是photoshop的初学者,所以步骤...
在做《机房收费系统》的时候,有的表需要添加自增列,在添加新纪录时自动添加一个序号。下面我给大家介绍两种添加方法: 一、通过T-SQL代码. 代码如下: alter table 表名 add 列名 int IDENTITY(1,1) NOT NULL 这里用到了identity关键字:indentity(a,b),a b均为正整数,a表示开始数,b表示步长,indentity(1,1)就代表从1开始,每次增...
很多时候想要设计漂亮的Android UI,使用Android自带的控件无法满足我们的需要就要考虑自绘控件,在Android界面显示类View,可以通过继承扩展重写相关方法来实现我们的图形绘制。 首先我们需要了解下View类的底层实现,在SDK中我们可以看到View直接继承于Java的基类Object,实现了图形绘制和按键事件 Drawable.Callback KeyEvent.Callba...
基本思路 利用热区交互的不同匹配方式实现同一热区不同的响应。在交互图标的右边放置若干群组图标,响应类型(Response Type)全部设为热区响应方式。第一个热区响应的作用是显示所有按钮,响应属性:匹配(Match)设为“指针处于指定区域内”(Cursor in Area);其余分别响应不同的按钮,响应属性:匹配(Match)设为“鼠标单击...

经验教程

227

收藏

83
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部