软件SKIN技术

--转自http://etomahawk.popo.blog.163.com/blog/static/919644820081128105845384/

软件的皮肤技术,简单的总结一下,可以用两个字来表示:自绘(或者说贴图)。当然,具体的效果如何,就要看你的基本功如何了。

根据实现的方式,可以分为两类:

A. 对现有的标准控件的换肤。Appface, Skin++, VCL Skin,SkinBuilder等一批换肤软件就是该类的代表。

B. 自己编写控件。AlphaConttrol, RZ系列控件就是该类的一些代表。这类控件库在delphi中尤其多。

编写皮肤需要基本功:

A. Windows 绘图技术。

既然是要换肤,当然要进行绘图,而要进行绘图,则必须了解Windows的一些绘图函数和Window控件的绘制过程。

B. Windows消息系统的了解。

Windows是一个消息驱动的系统,所以,我们必须对这个消息系统有所了解。我们必须了解一个控件是如何被绘制出来的,在绘制过程中都触发了那些消息。然后,我们过滤这些消息,在里面进行处理。

C. Windows API的了解。

对于一些特殊的控件,仅仅靠消息是不行的,必须依靠API HOOK技术。所以,我们必须对API有所了解。

第一类换肤的实现方法:子类化需要换肤的窗体,处理相应的消息。

 不同的控件可能有需要截获不同的消息。以BUTTON控件为例,我们需要截的消息有:WM_MOUSEMOVE,WM_PAINT,WM_ERASEBKGND,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBCLK,WM_MOUSELEAVE等等消息.

下面实现一个简单的皮肤,对进程中的所有BUTTON控件进行换肤。这个是我demo是我花了3,4个小时整理出来的,希望对喜欢探究界面处理有所帮助。

代码下载地址:http://download.csdn.net/source/916751

实现界面:软件SKIN技术 - 一意孤行 - 听泉居

这类技术也已经用在公司实际的项目中。这里是测试工程的一张截图:

软件SKIN技术 - 一意孤行 - 听泉居

利用这种技术,我们甚至可以对已经做好的产品进行换肤,就是将换肤的DLL注入到目标进程中去实现换肤,之前在写这种皮肤控件时已经实现。

第二类换肤相对比较简单一点,直接把第一个中的子类化出来的东西修改修改就可以了。

在我的前一篇总结中,已经有几个控件了,TSkinButton, TSkinSlider等。可以参考参考。在这里不再贴代码出来。

这种技术也使用到了公司的产品中。

现在正在完善的是一套WindowLess控件库。很多人对于QQ2009的界面技术很感兴趣(包括我在内,也很想做出来类似的东西,这就是我做这套控件库的初衷),其实就是画出来的了。百度Hi似乎也是自己的控件库。Popo也是自己的控件库(题外话:其实,我觉得网易还是不错的,至少很多思想是很有创意的,我就抄袭了它很多东西。^_^)。但是对于MSN来说,就不是了,MSN使用的是DirectUI技术。你可以用微软提供的工具AccExplorer32去看,所有的控件都是标准的(没有这个工具的可以到微软网站上下载)。甚至聊天记录都可以看的一清二楚!本以为MSN最新版本会有所改进,结果一看,仍然是一样的。

现在已经完成的控件有:

TSkinRichEdit: 自己实现的RichEdit控件。大家可能已经注意到,QQ2009的聊天窗体的聊天记录可以进行放大,按住Ctrl + 鼠标滚轮可以任意缩放,就像IE7的效果一样。第一次用的时候,觉得很酷。而且不是用图片拉伸出来的哦,很强悍。

软件SKIN技术 - 一意孤行 - 听泉居

TSkinToolBar: 工具栏控件。

软件SKIN技术 - 一意孤行 - 听泉居

TSkinPageControl: PageControl控件。

软件SKIN技术 - 一意孤行 - 听泉居

TSkinTreeView: 实现类似QQ好友列表的TreeView控件。

软件SKIN技术 - 一意孤行 - 听泉居

TSkinButton: 皮肤化的按钮类。这个在播放器上已经使用。

软件SKIN技术 - 一意孤行 - 听泉居

TSkinSlider: TrackBar控件。同样在播放器中已经使用。

TSkinEdit: Edit控件。播放器中已经使用。

TSkinListView: ListView控件。播放器中已经使用。

软件SKIN技术 - 一意孤行 - 听泉居

这些都是WindowLess控件,同时支持透明,Alpha混合,背景图片。

    还有很多控件还没有完成,看来,只能将它们放到2009年再去完善了。突然发觉自己越来越懒惰了,不能静下心来写点东西,也不能静下心来看点书。浮躁啊!也许是这一年经历的事情太多,希望能早点回归到正常状态。

最后,共享在换肤中比较难的控件内建滚动条换肤类,可以对TListView内建的滚动条换肤。其实,对于内建滚动条换肤,很多程序都是通过新建一个窗口覆盖原来滚动条实现的,这里的代码不是创建新窗口实现,而是API HOOK实现的。

(对于其他控件可能会有点小问题,参考了网上的一个兄弟的代码,在此表示感谢):

下载地址:http://download.csdn.net/source/917314

效 果 图:

软件SKIN技术 - 一意孤行 - 听泉居

OK,就写到这里吧。以后有什么新的东西再进行总结。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值