Delphi BCB 開發出xp風格的程式(转载)

pazee(耙子)
pazee@21cn.com

關鍵字:

window xp、xml、manifest、comctl32.dll

約定:

windows xp 以下簡稱 win xp 或者 xp;windows 2000 profressional + sp3以下簡稱 win2k proc++ 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風格呢?這個我沒有試驗過,希望大家試試。

阅读更多
版权声明:原创文章转载时请附上原文链接 https://blog.csdn.net/aniven/article/details/556247
个人分类: C++/BCB开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭