如果你希望能够在自己的程序中表现出新意,那么你一定不会仅仅满足于MFC 提供那些标准控件。这时,我们就必须自己另外多做些工作了。就改变控件外观这一点来说,主要是利用控件的自绘功能(Ow ner Draw )实现的。本篇将和各位一起定义一个XP 风格的CXPButton按钮类,目的不在于介绍CXPButton 类的使用技巧,而在于向各位阐述实现自绘按钮的方法。当然如果你觉得CXPButton 有用的话,也可以把它的源文件保存下来,直接加入到自己的项目中。 本篇要点: 一、准备工作 二、实现原理及难点 三、按钮类的使用 四、小结与提示 五、附录 一、准备工作 在开始编码之前,首先应该确定好,更准确的说应该是设计好按钮在各种状态下的外观。按钮控件的几中基本状态包括: Normal 状态,就是按钮一开始显示时的样子。 Over 状态,鼠标指针移动到按钮上面时按钮显示的样子。 Dow n 状态,按下按钮时显示的样子。 Focus 状态,按钮按下后松开的样子,例如标准按钮按下松开之后会看到按钮内部有一个虚线框。 Disable 状态,当然就是按钮被设置成无效的时候的样子啦。 我参考了一下Window sXP 中普通按钮的实际样子,设计出XP 按钮各种状态的外观,如下图所示: 至于Dow n 状态主要是在Over 状态的基础上将文字往右下的方向稍微平移,以实现下压的效果。 二、实现原理及难点 下面我们开始类的创建,在Workspace 的ClassView 页中右击列表树的根结点,选择 New Class„ 在弹出窗口中进行派生类的定义,如下图所示,注意,你需要填写的只有Name 和Base class两项,其余的选项保持默认值就可以了。 按OK 按钮退出之后,我们可以在ClassView 里面看到新创建的类的名字。接下来我们可以为 CXPButton 类添加各种成员变量。因为自绘控件说穿了就是画图,所以在成员变量中可以看到各种与画图有关的数据类型,一般来说成员变量会在类的构造函数中初始化,在类的析构函数中销毁。详细代码请参见本篇附带的源程序。 下面简要叙述一下按钮的实现原理: 1. 在控件初始化时为按钮添加 Owner Draw 的属性。这是因为在MFC 中,要想激活控件的自绘功能,要求该控件的属性中必须包含属性值 BS_OWNERDRAW,这一步我们可以通过类向导为 CXPButton 类添加 PreSubclassWindow()函数,在该函数中完成属性值的设置。当激活控件的自绘功能之后,每次控件状态改变的时候都会运行函数 DrawItem(),该函数的作用就是绘制控件在各种...