BCB实现XP风格

摘自:http://bbs.csdn.net/topics/50477692

windows xp 以下简称 win xp 或者 xp;
windows 2000 profressional + sp3以下简称 win2k pro
c++ builder 以下简称 bcb;
本文涉及到的delphi 都是delphi 6 + sp2,但不排除其他版本的delphi;
$(delphi) 定义为 delphi的安装目录;



前言

很多程序在window xp 里面的界面风格仍然是传统的风格。
很多人都采用了所谓xp风格控件,什么xpmenu等等,其实他们很多都是通过Skin技术来做到的,我本人不

喜欢过多地使用第三方控件,既然windows自身就是利用这些标准控件来做的,那么我们完全没必要过多

的用一些怪异的控件,因为我们可以通过修改思路来换作用标准控件实现自己需要的功能。
但为什么有一些程序却能变成xp风格,这是为什么?

这个关键在comctrl32.dll,他的名字因该是 Common Cortrols,公用控件库,如果大家在97年用过

delphi 3.0,会知道那个年代(97年)除了delphi和s3显卡的冲突还有就是不能在win95 OEM(所谓的win97)

中用delphi3,会报告Comctrl32.dll出错,需要拷贝一个其他版本替换,就是因为delphi中控件与

windows中的版本不符。

其实,大部分window开发工具提供的控件,都是封装了comctrl32.dll中的公用控件,还有一些自己额外

制作的控件,这样我们的开发程序就会随着comctrl32.dll的版本不同,出现不同的风格,win2k中提供的

是5.0,xp中在保留了5.0的同时还提供了新风格的6.0。
可以知道,我们的程序就是因为在winxp下仍然使用了传统风格的5.0,而没有使用新的6.0,如果用了6.0

那么凡是使用了comctrl32.dll中的控件部分都会变成xp的新风格了,下面我们要做的工作就是如何指定

程序使用新的6.0风格。


正文:

2个文件大家首先建立好,

(1)  xpstyle.xml 文件内容如下(不包括 ---- 行)
------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    name="[email protected]"
    processorArchitecture="x86"
    version="5.1.0.0"
    type="win32"/>
<description>Windows Shell</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

------------------------------------------------------------------------------

(2)  xpstyle.rc 文件内容如下(不包括 ---- 行,内容就一行)

------------------------------------------------------------------------------
1 24 xpstyle.xml
------------------------------------------------------------------------------


下面介绍2个方法;
外挂方式和直接在编译的时候增加对xp的风格支持;

1.叫做外挂可能不是非常恰当,反正你明白就行了。这个方法相对简单,而且对于很多没有源代码不能重

新编译或者不方便重新编译的可执行文件有效;

winxp 虽然内部版本号是nt 5.1 (win2000是nt 5.0),但是他一个特色就是大量的采用了xml。
下面拿delphi 自身开刀,把它变成一个xp风格的IDE(Delphi7提供一个第三方的工具可以做到这一点);

delphi 即使在win xp 下菜单和很多对话框的风格也都是传统的,下面我们改造他,拷贝xpstyle.xml 到 

$(delphi)\bin 目录下,改名字为 delphi32.exe.manifest,然后你运行你的delphi ,你会发现他的风

格变成了xp的了。(你可以比较那些对话框的会明显的发现)。
看明白怎么改了吗?其实简单,就是把这个xml文件拷贝到你的可执行文件的相同目录下(或者在快捷方

式中,指定起始位置为这个xml的目录),然后给他改名字为xxxx.exe.manifest,其中 xxx.exe 就是你的

可执行文件的名字,如果此时在运行程序出错,那么你只能删掉这个xml了;
如果你搜索你的xp 系统,你会发现有很多.manifest 的文件,如果你好奇把他们删掉,你的xp就变成传

统风格了,包括大家常用的MS Messenger。


2.编译通过增加资源文件方式;
用过BC for windows 或者 Win32 SDK开发过程序的朋友一定对于RC文件非常熟悉,BC还曾经提供了

workshop来编辑资源。
了解资源文件格式的我就不多说了,不了解找一些资料自己看看吧,不了解这个资源文件,可以说你的

windows程序开发不算入门,
下面以delphi 开发程序为例子,(在 BCB 里面步骤基本相同)
打开你的程序,然后 菜单->project -> add to project 添加这个xpstyle.rc 文件,他会在工程文件里

面加一行
{$R 'WinXPStyle.res' 'WinXPStyle.rc'}

然后你再编译出来的文件在 win xp 下就是xp的新风格,经改改造的程序大家放心,在非xp环境里它仍是

传统风格。


补充说明:
1.delphi(BCB)都是采用的VCL都是封装了windows自身的标准控件,但是因为封装的差异,并不是所有的

控件都能变成新的xp风格,比如 TBitBtn 虽然从TButton继承,但是他就仍然是传统风格,我原来喜欢用

TBitBtn现在也都改为 TButton了;

2.曾经看过国外的文章,提到这个做法对于TListView会有些问题,说在使用TListView 如果ViewStyle 

设置为 vsReport时,当你访问 TColumns 属性,会抛出一个Kernel错误,并说这个一个vcl与xp的兼容问

题。但是我在win2K pro + delphi 6 sp2里面并没有遇到这个错误;

3.很多第三方空间不能由于不是采用Windows 标准控件,不能改变风格,所以请大家至于检查界面的一致

性;

4.虽然程序的资源文件格式不是标准的格式,那么你的程序通过1方法仍然不能变成xp风格;

5.由于xp风格的窗口的Title(TForm.Caption 属性)区的高度比传统的要高,如果你的Form最下边留得空

隙不够大,那么你得Form会变得非常难看,或者出现一个讨厌的滚动条,相信很多人都有此经历;

6.对于第一种方式的扩展思考,我想对于.exe文件可以用办法1支持xp,那么同是PE格式的ocx或者dll文

件是否能通过增加xxx.ocx.manifest 来让他实现xp风格呢?这个我没有试验过,希望大家试试。

你可能感兴趣的:(BCB实现XP风格)