软件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,就写到这里吧。以后有什么新的东西再进行总结。


目前这方面的软件很多,但大部分都是收费的,不收费大部分又换的不全,对于一个学生来说花钱买是有些奢侈了,所以我一直就想做一个换肤软件提供给学生,让他们做课程设计或毕业设计时能轻易给自己软件美化界面。 但是一直苦于时间有限。工作太忙有时只能在周末或晚上写上两行代码。现在终于成形了本打算开源,但是有些地方还不完善(现只支持VC MFC, Windows Type: Dialog, SDI),所以现在只讲下原理,提供部分源码供感兴趣的人研究。现在发出来与大家共享。 现在商业的换肤软件大部分都是采用的Hook技术(呵呵,猜的,也许采用的更高深的技术)。Hook窗体消息,对窗体消息进行截获最终换成自已的处理方式。所以本人写的SkinMaster也是采用了同样的技术原理。说很简单但做起来有些困难。下面是我做Skin时遇到的问题及处理方式。 1.对于Windows基本控件进行Hook则可完成绘制。 2.对于菜单会制则有些麻烦,程序运行时窗体菜单WM_MEASUREITEM只运行一次,所以会出现在动态换另一套皮肤时菜单项大小不会跟据皮肤改变,解决方法是所有菜单你要动态生成。 3.主窗体的绘制,没啥太深技术就是要处理大量的消息。 4.滚动条的绘制,滚动条全靠Hook消息就没办法完成了,这个东西微软做的不像基本控件那样工作,还要对滚动条的API进行Hook。 先写这些,有时间我会把更详细的方法给大家写出来。下面程序中TestSkin程序提供源码,并完成了按钮等控件的换肤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值