有時候我有在用Win32 API來向窗體上添加控件時,經過CreateWindow或CreateWindowEx建立出來的控件的風格不像XP風格,而是像Windows 2000的風格,界面很難看。注意,是動態調用CreateWindow來建立控件,不是從資源中加載。html
這種狀況下,咱們怎麼辦呢,一般說來,形成這種狀況都是因爲沒有正確加載資源,咱們知道,像button, combobox, listbox等這些控件都是放在comctl32這個DLL裏面的,因此有時候在用這些系統自定義的控件時,須要咱們首先調用InitCommonControlsEx函數。這個DLL的版本有不少,存放在Windows\winsxs目錄下面,或者你直接檢索:common control,結果以下:函數
好了,下面說一下解決方案吧:url
這個根本辦法就是加一個manifest文件,其內容以下: 3d
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="XP style manifest"
processorArchitecture="x86"
version="1.0.0.0"
type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
保存成一個後綴爲:.manifest的文件,引入到.res文件中。xml
這樣就好了。 htm
還須要在資源文件中加一行:blog
//
1 RT_MANIFEST "TestCtrlStyle.manifest"
注意,有時候,加這樣一句代碼在資源文件中,連接時會出錯:資源
1>Linking...
1>CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409
1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corruptget
這個錯誤是說工程中已經包括了RT_MANIFEST文件。那麼此時,就不要加這句話,直接把這個.manifest文件加入到工程中就好了。it
修改事後的界面以下:
上面這種方法是用manifest來設定引入的comctl32的版本,但注意上面的manifest,裏面指定了這個comctl32的平臺:processorArchitecture="x86",若是這個應用程序想在x64下面運行,就會致使一個問題:這個64位的程序連接的是32位的comctl32庫,建立控件就會失敗。因此最好的解決方案就是下面這種作法:
在頭文件裏面加入下面的語句:
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
這裏就是根據編譯選項來指定連接什麼版本的庫,這樣編譯出來的程序就不會有上述的問題。