delphi bcb 开发出xp风格的程序[原创]
delphi bcb 开发出xp风格的程序[原创]
pazee(耙子)
pazee@21cn.com
关键字
window xp、xml、manifest、comctl32.dll
约定:
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="Pazee@21cn.com"
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风格呢?这个我没有试验过,希望大家试试。
问题点数:200、回复次数:61Top
1 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-01 15:04:55 得分 0
写得匆忙,如有错误请原谅。Top
2 楼domustdo(大头)回复于 2003-05-01 16:46:12 得分 5
好贴,收藏!Top
3 楼kataboy(老公)回复于 2003-05-01 17:07:24 得分 5
耙子,这么好的东西。还有吗?
Top
4 楼Tern(Tern)回复于 2003-05-01 19:41:48 得分 5
耙子高,有空的话多写些,让弟兄们多学点Top
5 楼cker(〖烟波浩淼三千里、人鬼殊途五百年〗)回复于 2003-05-01 20:16:17 得分 5
hehe!
This is your first article on CSDN ?
Good.Top
6 楼googoler(古乐)回复于 2003-05-01 20:42:07 得分 4
我一直用win2k
我也知道 comctl32.dll 是公用控件库!
一直很排斥用第三方控件,升级真的很麻烦!
也听说了xpstyle.xml的方式将传统风格改为XP风格,但因为不想装XP,故一直没试!
但是就在今天,我将我编的一个程序拷贝到一个朋友的笔记本上(win xp)下运行时,
窗口,还有DBGrid的Scrollbar都自动变成了XP的风格!
不过TBitbtn,还有Tspeedbutton就真的没变风格!
我自已都有点糊涂了!难道不用xpstyle方式就可以啦!还是因为我装了BCB SP3?!
我的编程环境:
win2k+sp3,BCB6+sp3,没有用xpstyle.xml的方法!
还请有条件的朋友再看看!
Top
7 楼net205(人不可以无耻到这种地步)回复于 2003-05-01 21:36:59 得分 4
对于xml文件设置XP效果的文章已经有好多了,不过这篇要详细一些。
对于这点我喜欢用第三方控件,因为用第三方控件可以在其他的操作系统中也有XP效果。
不知道操作系统怎么调用comctrl32.dll文件,不知道可不可以把XP下的comctrl32.dll文件拷到2000下,然后改一些设置使2000也具有XP效果,要是行的话,怎么改设置????Top
8 楼ThinkX(秋天的树)回复于 2003-05-01 21:39:55 得分 4
我觉得外挂的方式好些,不过Delphi6和BCB6对XPStyle的支持还是不好,也会不稳定。
Delphi7完全支持。Top
9 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-01 21:40:42 得分 0
to cker,
很久不见了,女儿可爱吧?
嗬嗬,我不会写东西,不知道这算不算文章。Top
10 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-01 21:51:24 得分 0
to net205(阿菜):
我不喜欢第三方控件是因为它可能带来更不稳定的因素。
xp 中同时提供了 comctrl32.dll 5.0 (5.80)版本和6.0,默认是5.0,自然大部分程序都会调用 5.0的东西了,除非你现实的说明使用新风格。
在MSDN中提到了一个 FlatStyle 属性,它能决定使用什么风格,如果让他为 System,就是系统决定,那么就会在xp是新风格。
对于TBitBtn同样是从 TButton 继承的,我想他的差别就是在
TBitBtn.CreateParams中的
begin
inherited CreateParams(Params);
with Params do Style := Style or BS_OWNERDRAW; //这一句
end;
6.0 里面的VCL 没有考虑到xp的这个新东西,所以支持的自然不好,比如上面说的TBitBtn和TScrollBox等等,很多第三方控件也存在这个问题,比如 Ehlib 2.6中的部分空间,我想可以通过修改源代码做到这点。
Top
11 楼jishiping(JSP 季世平)回复于 2003-05-01 22:01:28 得分 4
前几天我还刚刚发了一个帖子,问的就是TListView 如果ViewStyle设置为 vsReport时,每
次窗口激活时都会抛出一个Kernel错误。后来看了其他人的文章,知道是VCL的BUG。BCB5有
这个BUG,BCB6已经改正了这个BUG。大家可以到我提问的帖子看一下这个问题的说明:
http://expert.csdn.net/Expert/TopicView1.asp?id=1708700Top
12 楼googoler(古乐)回复于 2003-05-01 22:14:53 得分 4
又仔细看了看pazee的文章,
原来BCB6已支持XP风格,惭愧,惭愧!
看来该装个xp了!Top
13 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-01 22:57:10 得分 0
呀!没看到季头文章,原来这个bug你已经遇到了,我看的那篇鬼子的文章没提到delphi的版本,所以我只是在delphi 6 里面试验了一下,还是季头细心。
Top
14 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-01 22:59:13 得分 0
googoler(泰阿)
我公司的电脑都是win2k,但是有些客户是 xp,程序到了他那就变模样了,一个客户问我为啥不是新的风格,我才研究了n天,找到的文章都是洋文的,原来csdn就有了,呵呵。Top
15 楼woshizengmin()回复于 2003-05-01 23:01:48 得分 4
我还是采,所以一般用控件Top
16 楼googoler(古乐)回复于 2003-05-01 23:39:04 得分 4
2 pazee
还记得xp刚出来时,有个同事说:BCB5编的程序不是XP的风格,(那时候用BCB5)
我还跟他说,不可能,这个应该是通用的,就是那个comctrl32.dll!当时也没细
想,后来他说他试过了,我还好郁闷!公司也没要求去适应XP风格!后来在网上看到
xpstyle.xml,我才知道要额外处理!
我是最喜欢win2k的啦,到现在还没装过win me ,winxp!
直到今天才在xp上运行了一下我写的程序!
客户都用xp啦,这段时间又没来BCB版,落伍啦!
Top
17 楼Friecin(雪客)回复于 2003-05-02 03:38:39 得分 4
在应用XP风格以后,(编辑了xp.manifest,加入了.rc),我的ToolBar(Parent=CoolBar)上的TToolButton却工作不正常。
当鼠标放上去的时候,ToolButton可以浮起来,但是当鼠标点击的时候,ToolButton从效果上却不能按,并且将ToolButton->Style=tbsCheck时,无法相应事件?Why?
help!
Top
18 楼Friecin(雪客)回复于 2003-05-02 03:39:09 得分 4
在应用XP风格以后,(编辑了xp.manifest,加入了.rc),我的ToolBar(Parent=CoolBar)上的TToolButton却工作不正常。
当鼠标放上去的时候,ToolButton可以浮起来,但是当鼠标点击的时候,ToolButton从效果上却不能按,并且将ToolButton->Style=tbsCheck时,无法相应事件?Why?
help!
Top
19 楼sbbmu(蛋白芯片)回复于 2003-05-02 06:36:25 得分 4
good
收藏Top
20 楼copy_paste(木石三)回复于 2003-05-02 09:03:20 得分 4
认真读帖,认真学习,认真接分。
呵呵,还没装XP,看来是落伍了。。。Top
21 楼chifengwatch(chifengwatch)回复于 2003-05-02 10:00:38 得分 4
认真学习Top
22 楼favorit(九天剑舞·曾几何时,醉里挑灯看剑)回复于 2003-05-02 10:32:22 得分 4
xinye(路人丁)又到这里来程序灌水了!
先收藏
@_@Top
23 楼slmxy(初中毕业)回复于 2003-05-02 10:41:33 得分 4
好!虽然不懂^_^Top
24 楼cupidvenus(小鱼儿)回复于 2003-05-02 10:55:25 得分 4
好!学习!收藏!Top
25 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-02 14:34:40 得分 0
favorit() 都成猩了,恭喜呀!Top
26 楼myy()回复于 2003-05-02 14:43:52 得分 4
木头,好久不见你了呀,在忙什么呢?Top
27 楼favorit(九天剑舞·曾几何时,醉里挑灯看剑)回复于 2003-05-02 15:01:31 得分 4
你消失了n年,当然看不见了!
@_@Top
28 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-02 15:13:53 得分 0
木头我在playicq.com 里面昨天还看到他写的帖子了。可能他最近在DFW呢。
to Friecin(雪客)
你说的问题我在delphi 6里面没有遇到,因为身边没有BCB,但我考虑都是VCL,应该差不多。
不知道别人如何。Top
29 楼amfer()回复于 2003-05-02 15:27:15 得分 4
以前也见过这样的文章,稍微有些不同,还有个步骤是说把这个.RC文件用BRCC32还是BRC32编译成.RES文件,我在BCB里用的都是.RES文件,不知道怎么编译,我却忘了!Top
30 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-02 16:06:04 得分 0
这个编译的资源文件的过程通常可以忽略,因为你编译的时候他会也同时编译了这个资源文件的。Top
31 楼cker(〖烟波浩淼三千里、人鬼殊途五百年〗)回复于 2003-05-02 16:09:08 得分 4
xp风格的问题,我早有过尝试,就是在程序资源里加个manifest,
不过直接对BCB外挂的话,imagelist有点问题,突出的表现为切换XP风格的时候,imaglist中ICON资源,会损坏.Top
32 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-02 16:37:37 得分 0
cker
我今天早上也发现了imagelist 有问题,弄了半天没弄明白。
我用的是加入到资源文件的办法,也出错。
但是我原来的程序只是增加了这个资源,它里面的TImageList 就没问题,靠,晕了。Top
33 楼missdeer(思鹿)回复于 2003-05-02 16:38:17 得分 4
Delphi版有介绍“超级猛料”的下载,里面有一片E文就是说BCB5下的TListView在ViewStyle
设置为 vsReport时有Bug,还有他附带的解决办法,可是我照着他的方法做还是不行,可能是我的英文不好,没看懂吧,哪位老大弄得好,就告诉小弟一下。BCB6.0中确实没有这个bug,Delphi7.0中也是正常的。
另外,“超级猛料”里有一个Controls.res文件,只要替换BCB/Delphi中相应的文件,就可以缺省创建XP manifest的程序了,我在BCB5.0/6.0和Delphi6.0/7.0中都试过,至今还没出现什么问题。Top
34 楼missdeer(思鹿)回复于 2003-05-02 16:41:44 得分 4
还有那个外挂的方法,我在BCB6.0中用过一段时间,后来偶然间到Win2000下运行那些程序,发现只要有TImageList的程序,都不同程度地出现问题,最严重的就是程序根本不能运行。可能是BCB6.0附带的VCL对TImageList的包装,对XP manifest有不兼容的地方吧。Top
35 楼lifuming(忧黑)回复于 2003-05-02 22:04:43 得分 4
好帖,认真的学习实践Top
36 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-02 22:41:36 得分 0
delphi 6.0 的确ImageList 有问题,我给Delphi32.exe 自身弄了一个外挂,发现一使用TImageList 就出错,看来的确是有兼容问题。
Top
37 楼cker(〖烟波浩淼三千里、人鬼殊途五百年〗)回复于 2003-05-02 22:50:19 得分 4
呵呵,最后我还是放弃了这样的做法....:)
如果加入uxtheme.h...,然后再作一些工作,应该可以解决这个问题。
不过我没有试过,呵呵...:)Top
38 楼spaceman(菜鸟.net)回复于 2003-05-03 13:27:40 得分 4
学习Top
39 楼Behard(我爱天安门)回复于 2003-05-03 23:10:22 得分 4
学习Top
40 楼liuwl(美丽克星)回复于 2003-05-03 23:18:30 得分 4
强》》》》》》》》》》》Top
41 楼Killmyself(有史以来最蹩脚的程序员)回复于 2003-05-04 08:42:16 得分 4
好,提供经验Top
42 楼yigebendan(▲★星星和三角我全有啦 :))回复于 2003-05-10 22:05:47 得分 4
学习学习!Top
43 楼yyfzy(singler)回复于 2003-05-11 11:00:42 得分 4
好文!Top
44 楼lanren_me(阿波)回复于 2003-05-11 14:12:00 得分 4
高.
学习.Top
45 楼qibo999(行路者)回复于 2003-05-11 14:24:16 得分 4
学习.
Top
46 楼Friecin(雪客)回复于 2003-05-11 14:38:19 得分 4
无论是BCB6还是DELPHI5,6都有一个问题:TToolbar
创建一个CoolBar,在上面放上一个TToolBar,然后添加一些ToolButton,设置HotImages\DisImages\Image 就会出现如下问题:
则对ToolButton没有按下后的效果;
设置ToolButton->Style=tbsCheck;则无法相应Click事件(等于失效)
ToolBar问题多多!自己看看吧。
Top
47 楼hpux()回复于 2003-05-11 15:08:43 得分 4
比下载控件复杂,但是有意思,佩服!Top
48 楼Yans(跟贴是一种友谊)回复于 2003-05-14 09:03:35 得分 4
哇,全是高手,搬个板凳来听课!
收藏!Top
49 楼netsys2(来电!)回复于 2003-05-14 09:08:24 得分 4
收藏!Top
50 楼Yans(跟贴是一种友谊)回复于 2003-05-14 09:20:37 得分 4
我也不喜欢用第三方控件,可是怎么才能让我的程序在任何操作系统下(win9x,2000,xp)都是xp风格呢?郁闷!Top
51 楼bigwhiteshark(变性鲨鱼)回复于 2003-05-15 00:11:55 得分 4
TO Yans(非典型菜鸟)
我倒这不简单 就把comctrl32.dll一起发包啦
Top
52 楼cker(〖烟波浩淼三千里、人鬼殊途五百年〗)回复于 2003-05-15 00:32:14 得分 4
嘿嘿,大白鲨又要被人笑话啦Top
53 楼comerliang(天地良心)(性欲被自己倒分倒没了,以后再也不敢倒分了,想倒分的兄弟看看我的下场吧,男人没了性欲真不爽)回复于 2003-05-15 08:08:22 得分 4
好贴,收藏!!!Top
54 楼qibo999(行路者)回复于 2003-05-15 08:14:53 得分 4
好贴Top
55 楼houmoker()回复于 2003-05-15 18:45:20 得分 4
markTop
56 楼missdeer(思鹿)回复于 2003-05-17 16:14:38 得分 4
大家有没有注意过XP下的“磁盘碎片整理”程序中的主菜单和其它程序中的菜单不一样?Top
57 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-05-17 23:09:05 得分 0
我看了,他似乎是用的button做的。Top
58 楼sephil(NAILY Soft 【哈里波特大】)回复于 2003-05-18 01:22:29 得分 4
Delphi7已经完全支持了
C6不清楚
C5/D5及以前版本ListView的确是有问题的Top
59 楼888888888888(888888888888)回复于 2003-05-18 15:11:14 得分 4
关注Top
60 楼zbc(修身养息,百战不怠)回复于 2003-05-19 13:21:28 得分 4
值得学习Top




