有时候我有在用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
这里就是根据编译选项来指定连接什么版本的库,这样编译出来的程序就不会有上述的问题。