激烈振动

Visit My MSN Space

导航

Skin技术实现框架(二)

周末过得很充实,攀岩,游泳,fb
今天继续记录Skin技术,CodeProject总算可以上传了,文章在这里,代码可以在这里下载。

原理

上次基本上是些介绍,也就是废话,今天讲讲实现Skin的基本原理吧。要实现自己独特的界面,方法有很多啦,上次也说过,这里只讲一种,就是通过消息钩子改变已有控件的外观。这种方法的好处是可以不必修改程序已经完成的标准界面,只要把钩子函数挂上,所有的界面就都变了,使用起来非常方便。这里的基本原理就是下面这个调用:
SetWindowsHookEx(WH_CALLWNDPROC, HookProc, 0, lThreadID);
WH_CALLWNDPROC钩子可以截获所有线程ID为lThreadID的线程内的窗口消息,这样我们就有机会处理这些消息。
但是,光截获消息还不够,我们还必须知道这些消息是谁发出的,Button和EditBox发出的相同消息显然必须得到不同的处理。幸运的是,从消息的参数里,我们可以得到窗口句柄,而通过窗口句柄,我们可以得到窗口类。这里说的窗口类可不是C++的类,而是Windows系统中的窗口类名。例如,按钮的窗口类是“Button”,组合框的窗口类是“ComboBox”...这些在MSDN里面都可以找到的,另外,还有一些文档中不存在的窗口类名,比如对话框,有一个叫“#32770”的类名,而菜单,实际上也是一个窗口,其类名是“#32768”。有意思吧,有了这些信息,我们就可以区分不同窗口进行处理了。
至于处理些什么消息,显然最重要的是WM_PAINT消息。这样我们可以重载系统默认的绘图方式,而把控件窗口画成我们想要的样子。但是只处理WM_PAINT消息也是不够的,因为控件的样式不是一成不变的,看看WindowsXP的显示效果,以按钮为例,有很多种样式,普通样式、鼠标在按钮上的样式、鼠标按住按钮的样式、鼠标按住按钮又移动到按钮外的样式...... 为了实现动态的炫目的Skin效果,我们还需要截取一些其他消息,例如鼠标消息。下载的代码里有Mac按钮的一个实现,看一下就知道了。
原理就这么多了,好像不是很复杂是吧,不过知道了原理和能写出实际工作的代码,还是有很大区别的。还有非常关键的设计和编码,这些,留等下次在说吧,今天就到这里,就到这里了
再贴个图吧

posted on 2004-05-17 15:53  vibration  阅读(3193)  评论(0编辑  收藏  举报