界面换肤技术

各种流行的界面换肤控件库比较

用VC做程序的时候,如果对界面样式不满意怎么办?自己从各种控件基类继承,然后自绘么?对高手来说,这虽然不能算是难题,但是仍旧比较麻烦,对新手来说,连看什么书都不好说。那就没有更好的方法么?当然有!这就要用到一类称作“界面换肤”的工具包了。

且看这些工具包有什么作用。当你使用一个界面换肤工具包的后,在不改变代码的基础上(除了使用库函数),你的程序将变成另外一个样子,当然这个样子可以很cool,也可以很poor。下面我们来看看当今有什么好的换肤工具包可以使用。

1、SkinMagic

这个是一个比较强大的换肤工具包,通过在自己的应用程序中包含SkinMagicTrial.dll、 SkinMagicTrial.lib、SkinMagicLib.h和*.smf皮肤文件即可实现界面换肤的功能。另外,它还自带了一个 SkinBuilder,可以制作自己的皮肤文件,并应用到我们自己的应用程序中。它的功能很丰富,有近20个SDK形式的API可以调用,用以辅助换肤功能。它目前的最新版是2.4,可以到它老家下载http://www.appspeed.com
访问网址超出本站范围,不能确定是否安全 
继续访问 取消访问http://www.appspeed.com,但是下载回来的只是一个试用版。试用版会有所限制,主要表现在:当我们打开添加了皮肤的应用程序的时候,会出现一个未注册的对话框;在SkinBuilder中会有一些限制,如未注册无法导出图片等。当然,这些限制完全可以通过反汇编的方法破解掉,有需要的朋友可以参看我的另一篇文章《关于SkinMagic的破解》。

2、SkinFeature

这个换肤工具也比较不错,完全支持各种开发语言的换肤,皮肤制作工具也很强大,最重要的是完全支持PNG图象格式。从目前来看,一般公司的以png图象格式为流行图象格式,方便了皮肤制作工具的使用。经过测试,稳定性还是不错的。使用起来也非常的不错。皮肤效果很棒。http://www.skinfeature.com


3、Skin++

这个换肤工具也不错,在它的官方主页上可以下载到最新2.0.1版的DEMO,也因为是DEMO,所以可用的功能少的可怜,只能看看人家的效果了。另外,现在网上有这个版本的破解文件,我没有做测试,不知能不能用。即使假设它能用,但是DEMO版的Skin++没有附带皮肤编辑器,所以其皮肤文件自然也没法自己制作了。

4、AppFace

这也是个不错的换肤工具,附带皮肤编辑器,而且其皮肤编辑器还支持锁定皮肤的使用权限,当然这需要有序列号了。按照这个软件的说法,它在加载皮肤的工作上进行的优化,所以看起来它的执行效率还是不错的。网上可以下载到它的demo版,限制是没有一个安装程序,所以也就没法在发布软件的时候用了,而且开发库appface.dll也有20天的试用限制,目前还没有破解。

5、SkinCrafter

这个软件制作的皮肤效果相当的嚣张,当然也是足够cool了!它的皮肤编辑器也很强大,支持的功能也很多。不过这样嚣张的软件,在限制上更加嚣张了。首先是运行应用程序的时候会弹出一个对话框,其次是在应用程序的标题栏中添加未注册的字符串。这个最新版的破解我还没有找到,但是较低的 1.8.2版的破解补丁我还是有的。另外,这个似乎对Windows2000的支持很不好,运行时会出现内核错误,而在Windows XP上则没问题。

6、ActiveSkin

这个工具是用ActiveX组件技术实现的,在添加初始化代码的时候稍微有些复杂,而且使用方法也和之前的各种不太相同。它依赖% windir%\system32\activeskin.ocx来工作,不过这个ocx组件已经被破解了。它的功能也比较不错,只是其皮肤编辑器不支持丰富的控件,记忆中连ProgressBar都不能支持,不知道是不是demo的问题(破解只能使其不出现未注册对话框)。


要是让我做个总结的话,如果有一种结合了SkinFeature 的多平台、SkinCrafter的皮肤编辑器、SkinMagic的实现形式,那将是一个十分强大换肤工具。另外,如果有更多的高手可以写写如何自己制作换肤工具的话,对于想要学习的人来说,将是多么可贵的财富呵~

 

换肤技术原理

 

说到换肤就要提到界面库,界面库一般来说分2种,一种是基于传统窗口句柄控件的, 还有一种是基于DirectUI的。

当然比较早的专业界面库都是基于传统窗口句柄控件的,而这种界面库实现换肤的方式一般是基于Hook,大概原理是:

(1)安装窗口过程Hook(如WH_CBT Hook ),准备截获应用程序所有窗口的创建事件
(2) 收到窗口创建等消息,根据类名、风格等一些条件来判断是否对该窗口控件进行Subclass
(3)
如果需要则安装相应控件类型的Subclass,窗口Subclass后即可以收到该窗口所有的消息
(4) 根据不同的消息进行相应的处理, 根据皮肤类型进行相应的绘画
(5)窗口销毁是进行UnSubclass

用上面这种Hook的方式可以拦截所有系统控件的消息,界面库可以根据当前的皮肤类型进行相应的绘画和处理。
对于使用者来说往往非常简单,我们只要在程序中直接使用系统的标准控件,然后通常只需在程序初始化时调用界面库的一个初始化函数即可实现完整的换肤。
当然要所有换肤的工作量都移到了界面库里,界面库要根据皮肤类型实现所有控件的绘画处理,而且Windows系统的各个版本又各有差异,所以界面库往往会非常复杂。这种方式的优点是使用简单,并且程序的开发语言也没有限制;缺点是界面库复杂性带来的不稳定性。

还有一种对窗口控件实现换肤的方式是用户根据需要,自己Subclass某些控件,
自己根据皮肤风格,自己贴图处理, 这种方式被大部分不依赖第三方专业界面库的程序所采用。我前面的截屏小工具就属于这种方式,它的优点是灵活稳定,自己好控制;缺点是开发人员需要一些控件知识和绘画技能,并且也不能跨语言共用。

另外,关于换肤本身,又分不同类型。有的换肤只是简单的改变一下背景图片(颜色), 也有的换肤是改变整个窗口的大小和Region(异形窗口), 还有的换肤还改变了控件的位置,这取决于皮肤的类型设置了哪些东西要变化,变得越多实现越复杂。

最新的界面库一般采用的是DirectUI技术,即按照游戏界面的思想,所有的控件全都画在一个窗口上模拟出来,这种方式的优点是透明度和动画等全都可以自己控制,从而可以实现很炫的界面效果,当然换肤对它来说更是小菜一碟。

我们基本上可以从QQ界面的演变来验证这一趋势,从最早的单一风格窗口,到后来的换肤和异形窗口,再到现在的DirectUI。当然QQ采用DirectUI技术除了实现界面炫方面考虑,应该还有安全方面的考虑。

总的来说DirectUI是趋势,而微软的WPF代表了DirectUI最先进的技术方向,换肤对于DirectUI来说非常容易。随着Win7,Win8 的普及,传统界面库的市场会越来越小,一来因为
系统本身已经很炫了,二来微软自己的WPF和Xaml技术基本上已经可以实现任何想要的效果。当然只要XP不消亡,传统的界面库还是有自己的一席之地。

 

目前这方面的软件很多,但大部分都是收费的,不收费大部分又换的不全,对于一个学生来说花钱买是有些奢侈了,所以我一直就想做一个换肤软件提供给学生,让他们做课程设计或毕业设计时能轻易给自己软件美化界面。 但是一直苦于时间有限。工作太忙有时只能在周末或晚上写上两行代码。现在终于成形了本打算开源,但是有些地方还不完善(现只支持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、付费专栏及课程。

余额充值