Skin技术实现框架的步骤
Skin技术实现框架的步骤
本来想把代码和E文的文章提交到codeproject再写,不知道为什么,这两天codeproject提交向导一直有问题,也罢,先开始写原理吧,反正恐怕也要写几天的
前言
嘿嘿,估计今天写不了多少,就叫前言吧,下次再写原理
说到skin技术,大家都不会陌生,最早接触这东西,可能是winamp吧,可以灵活的更换界面风格,非常的花哨。后来使用skin的软件就越来越多了,毕竟做一个漂亮的界面对软件还是很重要的。虽然Windows标准界面越做也是越花哨,但总不能满足人的胃口。有一个自己特殊的华丽界面总是值得夸耀的,看看MSN Explorer,Media Player, RealOne...。实现这种定制的外观方法很多,早期的Skin技术都需要程序本身做许多处理,基本就是贴一些图片在界面上,然后通过换图片获得不同的视觉效果,象winamp就是这样的。这种方式其实非常灵活,可以实现想要的任何效果,缺点是编码实现起来太麻烦了。
随着希望有自己特定Skin的软件越来越多,就出现了专门的Skin插件,这个比较有名的是WindowBlinds和ActiveSkin,我所知道和用过的就这俩,也不知道是不是最有名的,这些产品一般都是提供一个COM组件,需要Skin支持的程序创建这个COM组件,然后调用几个方法,就可以使自己的程序外观完全改变,甚至可以在运行时动态改变外观。这样的组件包使用起来非常的方便,不需要编程者对skin技术有任何的了解。缺点么,主要是要收费的,当然我们可以用破解版,我当初用的WindowBlinds组件就是我们公司一大拿花了一晚上弄出来的破解版。收费只是一方面,用人家的劳动成果是应该给钱的,真正的问题在于往往还不能满足要求。为了弄出100%符合自己要求的Skin,当然就只能自己写了。
从今天起我就来讲讲怎么写这样的Skin插件。2002年的时候写了一个这样的插件,当初的目的是在PC机上模拟Mac的效果。一开始用windowblinds组件,总是不能令人满意,终于说还是自己写吧,就开始写了。花了一个多月的时间吧大概,本来已经写的差不多了,后来由于商务上的原因,居然项目取消了,白干了。当然对于技术人员没有什么白干的东西,工资没少发,技术上提高了
前两天有人问我关于消息钩子的问题,忽然想起前年写的这个东西了(前年?!怎么过的这么快,老了)。看看当初的代码都还在,而且这东西的设计,当初颇让我自己得意的,现在看看,也确实是不错的。与其让它躺在硬盘上腐烂,还不如拿出来晾晾,说不定对同学们有帮助,没准有兴趣的人一起弄个OpenSource的项目继续写也是不错的
设计目标
前言差不多了,下面写点设计目标。这东西最重要的设计目标是使用方便,已有的程序创建一个COM对象,调一个方法就可以把界面外观全部改成Mac风格的。另外一个目标是要有扩展性,因为另外存在要在Windows98上模拟Windows XP界面效果的需求,以后还可以出现模拟其他系统的要求。所以,基本的设计是定义一个统一的接口,然后做不同的实现。每一种实现单独做在一个COM DLL中,调用方选择一个CLSID创建对象就行了。干脆把接口的定义先贴出来吧
interface ISkinX : IUnknown
{
[helpstring("Install Skin hook")] HRESULT InstallSkin([in] long lThreadID);
[helpstring("Uninstall Skin hook")] HRESULT UninstallSkin();
};
调用InstallSkin安装Skin,UninstallSkin卸掉Skin,lThreadID是线程ID,这个后面会解释。
今天就到这里吧,最后贴几个图片,看看效果先