Delphi皮肤控件分析与QQ的皮肤变色功能

  1. 云栖社区>
  2. 博客>
  3. 正文

Delphi皮肤控件分析与QQ的皮肤变色功能

技术小美 2017-11-12 20:21:00 浏览677
展开阅读全文

    关于界面美化方面,一直是一个脑壳疼的问题!以前一直偷懒,使用的三方控件!但是在使用了一段时间之后,都或多或少的有些问题!不是我说三方控件如何如何的不好!只是三方控件多是庞大的一个肢体,要兼顾的用户群体很多,所以同时它要考虑的问题也增加了很多,然而一个程序出现Bug是在所难免的,所以三方控件那庞大的肢体在出了问题之后,修改就相当麻烦,首先得捋顺控件的实现过程,才能找到问题所在进而修改,所以虽然很方便,可是再有些时候也是很痛苦的!我用过的三方皮肤控件还算比较多了,这里重点说两个很流行的,一个VCLSkin,一个BusinessSkinForm,相信多数美化爱好者,对这两套控件都不陌生,无论使用与自己写皮肤控件时候参考,都是不可多得的好代码!为什么拿这两套控件来做说明,主要原因是这两套控件的实现原理不相同,而皮肤美化的方法,我所知道的也就这两种方法(当然可能有其他的,不过我不知道,呵呵),先说VCLSkin,此套控件,采用的是Hook,进而子类化,然后截获各种与界面绘制相关的消息进行控制从而达到界面美化的目的,这个实现起来,就是不必做新控件,直接Hook到窗口过程,处理掉就行,但是由于是Hook,是以各种问题都跟着来了,先不说Hook链太长,系统效率低下,就是Hook了,经常可能导致某些过程挂钩了之后,未被还原成原有过程,或者某些过程地址已经无效,钩子函数还在调用从而导致的各种内存错误!再说BusinessSkinForm,这套控件,相对于VCLSkin的Hook子类化来说,又采用了另一套实现机制,那便是,自己制作轮子,全部自己手工从底层打造一个个的皮肤控件,或者对现成的VCL控件进行一些额外的包装来支持皮肤属性,这个从实现角度来说要比VclSkin麻烦许多(比如,要支持一个有皮肤的按钮,就需要从底部写一个按钮,要皮肤化ListBox,就需要重新另外包装一个ListBox来支持皮肤效果),不过使用起来的话,那比VclSkin肯定要稳定许多。所以我是一直钟情于BusinessSkinForm的,也用了相当的时间!但是也是或多或少的有着一些Bug或者用着不爽的地方,比如BusinessSkinForm的Hint皮肤化后经常出现问题,一会有问题一会又没问题,定位真正的错误位置都麻烦!同时当窗体复杂了之后,界面拖动大小的时候,延迟很明显,同时界面闪动的非常厉害,到了无法忍受的地步,如果真要一个个的去修改到符合自己的使用习惯与开发方式,那花费的力气可是不容小窥!于是趁着过年几天在家,着手开始实现自己的一套皮肤控件!实现方式自然是用BusinessSkinForm的实现方式,目前基本上实现了窗口的皮肤化,至于如何实现,大家可以参考BusinessSkinForm的源代码(这个,网上有很多地方都搞出了源码的,嘿嘿.....),我这里就不做公布了,如果有好的源码自己都不做参考,那么就是自己的******了,呵呵。

上面的分析,仅作参考,文中的纰漏与不当,欢迎指正!

    下面重点说说QQ的皮肤变色的功能,这个功能,在CSDN上有个博客谈到了如何实现QQ界面的,里面讲的非常好,就是根据HSV来对饱和度与亮度的控制等,具体位置

他那个是用C++实现的,其实这些个东西与语言无关,原理相通,无论你用何种语言,都无所谓的。在Delphi中,也是如此,将像素点的RGB信息转换成HSV信息,然后调动HSV之后,然后再将HSV的信息转成RGB的信息还原到对应的像素点,那么这个皮肤换色的功能也就完成了。如:

2010022223224385.jpg

这个就是我皮肤化后的窗口!目前就只实现了这一个皮肤与中间的TrackBar控件,用来改变色调,饱和度与亮度来实现界面调色!

很是有点麻烦,目前又多加了几个控件!进度不快(因为只有业余时间来做一下)

2010031022424215.png

目前增加了菜单与ToolBar和Panel等控件

新效果

本文转自 不得闲 博客园博客,原文链接:http://www.cnblogs.com/DxSoft/archive/2010/02/22/1671586.html   ,如需转载请自行联系原作者



网友评论

登录后评论
0/500
评论
技术小美
+ 关注