< 想法 >
软件的“换肤”技术早已不是什么新鲜事了,但细心的朋友一定已经发现了,现在正悄悄地流行了一种新的改善视觉效果的方法——这里我斗胆定义为“换肤色”技术吧!用过winamp 5、windows mediaplay 9、msn messenger 6、qq2004这些新版本软件了吧,呵呵, 全都采用了所谓换汤不换药的“换肤色”技术。挺有意思是吧,下面我们就“自己动手,丰衣足食”。
< 准备 >
首先我用exescrope打开了wmp9和msn6的相关可执行文件和动态链接库,没找到有关界面的资源,晚辈才疏学浅,猜想可能它们的界面是实时计算出来的吧。qq2004和winamp5就比较直观了,一个是直接用bmp文件的,另一个采用的是png格式。
bmp文件没什么好说的,关于png格式我这里略说两句。png(portable.network graphics)是为了适应网络数据传输而设计的一种图像格式,用于取代格式较为简单、专利限制严格的gif图像文件格式。png格式大致具有以下优点:高压缩率、支持alpha通道(全透明、全不透明、可变透明)、提供gamma(图像亮点)校正机制、提供二维交叉存取机制、支持真彩/灰度/颜色索引的图像。
分析了一下winamp5的图形界面布局,他许多漂亮的阴影、渐变效果可不是bmp通过指定颜色透明能做到的;另外考虑到一个程序使用图片皮肤的话文件都会比较多,bmp的话一般都至少有几百k的总大小;所以我觉得png图片更适合来做绚丽的界面皮肤。
delphi默认是不支持png格式的图片的,只能去下载第三方控件了。到dfw论坛里去搜了很多终于让我找到了pngimage这么个好东东,带源代码、帮助文件,无需安装,支持png透明。呵呵,这样我们就可以开工了!
< 动手 >
我先看了一下pngimage的帮助文件,里面的《example 3: drawing png over other formats》是一个将一幅指定的png图片读入后覆盖到一幅jpg图片上的示例,我尝试了一下能很好的支持带透明的png文件。因为是要拿这些png文件来作程序界面的,所以我首先打算要把这个png图片画到窗体上去:
| uses ..., pngimage; // 加上这个 procedure tform1.formpaint(sender: tobject); rect.left := 0; png.draw(canvas, rect); png.free; |
以上代码实现了将1.png文件读入后画到窗体上去,这张图片是winamp5的默认主界面,其中右下角有一块凹入的是透明部分,怎么样,效果出来了吧(如图1)。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器