俗话说佛要金装、人要衣装,作软件的当然得要个好界面啦。网上提供的控件自绘基本上
是 MFC 或 WTL 封装好的类,对于不想用 MFC 的人来说是一无是处的,我可是 WIN32API
的坚决拥护者。因为 MFC 等也是用 WIN32API 封装起来的,学好了 WIN32API,可以深入
的了解 WINDOWS 内部的机制,编写出来的程序才能得到更好的优化。
下面分析一下自绘按钮的原理,用过 MFC 自绘按钮的人都知道,是通过重载了父窗口
WM_DRAWITEM 的响应消息实现的。同时也要子类化按钮来得到按钮的其他有用的消息 ,
比如 WM_MOUSEMOVE、WM_KEYDOWN 等消息。因为 MFC 的消息循环都是封装好的,
所以只要派生一下基本控件类就可以了。当是用 WIN32API 做的话就需要自己来子类化按
钮窗口的消息循环了,相信经常编程的朋友都知道,子类化控件要用到 SetWindowLong 来
改变窗口的回调过程,然后在回调窗口内添上自己需要处理的消息即可。因为我们要实现
自绘按钮所以最好把子类化的过程做成一个类,然后传给它要自绘的按钮句柄就行了。因
为要在类里面实现消息回调函数,但是类里面的消息回调函数只能是静态的,所以不能对
应每个实例的消息回调。在我实现的按钮子类化类里,我用到 Thunk 技术或 SetProp 函数
来实现的,具体请网上查找。
下面我来谈谈自绘按钮里最重要的部分,就是响应按钮消息函数里的 WM_PAINT 消
息,我们所有的自绘动作都在这里进行的。WM_PAINT 里的绘图操作与普通窗口的操作一
样 , 但 是 为 了 跟 踪 按 钮 的 当 前 状 态 , 我 们 还 要 响 应 按 钮 窗 口 的
WM_MOUSEMOVE、WM_SETFOCUS、WM_KILLFOCUS、WM_LBUTTONDOWN、W
M_ENABLE 等消息来得到当前按钮的状态。从而在 WM_PAINT 里面绘出不同的状态,能
实现的东西很多可以说你想多少基本就能实现多少,看个人喜好了,我提供源代码大家可
以自行修改。我也是参看了 ButtonST 里面自绘的代码,我自己添加了右键拖动功能,鼠标
掠过发生功能大家有兴趣可以自己添加,锻炼一下自己的编程能力。
下面我说一下我做的这个类的一个问题,我把按钮类做成了一个动态库,调用时只要
加上我的头文件和连接的 lib 库就可以了。我的动态库在 WIN32 的程序加载是没有问题的,
但是在 MFC 里面,必需要响应父窗口的 WM_DRAWITEM 消息,在里面直接返回,而不
要调用 MFC 默认的处理就 OK 了。这是因为我没有截获父窗口的 WM_DRAWITEM 消息,
否则在关闭程序时会出现非法操作!主要代码分析如下:
自绘按钮类声明:
class DLLPORT CWINButton
{
public:
//初始化按钮(这是第一步!)
BOOL GetItemhWnd(HWND hWnd);
//还原按钮区域设置
BOOL Restore();
//设置按钮是否可以拖动
BOOL SetDrag(BOOL Enable);
//设置按钮图标
评论4
最新资源