昨天这里有人问如何让delphi 开发出来的程序是xp风格,就此我写了一点东西

解决方案 »

  1.   

    delphi bcb 开发出xp风格的程序[原创]pazee(耙子)
    [email protected]
    关键字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="[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风格呢?这个我没有试验过,希望大家试试。
      

  2.   

    最简单的
    Delphi7里面有个Component封装了这个RES,直接添加即可