我有一个以前的用vc6开发的小示例,移植到vs2005上去,今天突然发现了一个小问题:直接使用vs2005生成的项目编译后工具栏的风格是xp风格(图1),而移植上去的项目工具栏风格却是2k风格(图2)。
![](/images/cppblog_com/wlwlxj/730/o_manifest_1.JPG)
(图1)
![](/images/cppblog_com/wlwlxj/730/o_manifest_2.JPG)
(图2)
当然我很清楚,这是manifest导致的问题,于是自然在vs2005直接生产的项目里去寻找manifest文件,结果没发现,转至项目目录下也没有发现。感觉很是奇怪,于是我全项目搜索“manifest”,发现stdafx.h里有如下代码:
#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
记得在vs2003里面是默认生成一个manifest,不同项目里面的manifest内容大同小异。而在vs2005里面是通过一个扩展的#pragma comment指令来生成manifest,该指令在vs2003中是无效的。编译器内部具体采用什么手段就不得而知,也无暇细究,不过大概思想就是强制使用高版本的common control达到漂亮的显示效果。我在c6转到vs2005的工程对应位置加上后,即达到了图1的效果,包括所有的common控件都切换到了xp风格。
这里注意几点:
1、必须使用unicode编译,否则无法达到效果。vs2005默认生产的项目是基于unicode编译的。至于网上所说的手动添加manifest文件的方法我没有试验过。
2、上面的#pragma comment指令只在vs2005中有效,在vs2003里面必须手动把编译字节码改为unicode才可使common控件变为xp风格。
3、common控件的xp风格最终还是取决于操作系统还有就是当前的显示主题,在2k的机器上是无法显示出xp风格的,在xp以上的机器上如果选择2k经典主题还是无法显示出xp风格。
posted on 2007-02-28 19:36
万连文 阅读(3201)
评论(0) 编辑 收藏 引用 所属分类:
乱七八糟