【转载】VC++6.0 MFC应用程序使用XP主题外观
一、实现原理
微软为Windows XP提供了Themes服务。Themes可以让程序具有“XP风格”,看起来更美观,因为微软更新了Comctl32.dll(ver 6.0)这个“XP风格”的控件。微软还为了保留传统的Windows界面风格,特地留下了Comctl32.dll v5.8。VC6的推出时间早于WinXP,因此VC6的程序默认是不使用“xp风格”的。
程序使用xp风格主要是内置了manifest这东东。因此只要让VC6的程序中包含即可。包含可以外置,也可以内置为资源。
二、实现方法
1.打开你的VC6 工程,找到资源试图(ResourceView),然后在视图中的树的根结点上点鼠标右键,选择菜单“插入(Insert)”。
2.在弹出的“插入资源(Insert Resource)”对话框中选择“Custom”,在新对话框(“NewCustom Resource”)输入框中输入24。 因为manifest的类型是24, 点击“OK”按钮。
3.在资源视图的树上面选择24下方的条目“DDR_DEFAULT1”上点右键,选择“Properties”,将ID:修改为1.
4.双击刚才修改的“1”条目,然后在右方的编辑器窗口中输入下面的代码:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="Company.Product.Name" type="win32" /> <description></description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
5.保存工程,重新编译
--【转帖收藏】原文出处不详
Note:并非只是MFC程序才这么做,所有Win32窗口程序要使用XP主题风格都可以这样来导入manifest文件;如果用这种方法,VStudio对文件的后缀稍微有所挑剔了,必须以manifest作为文件后缀导入到资源中。当然,还有个更加方便的方法,直接在工程的预处理文件中添加以下预处理代码:
#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
其实,这两种方式的实现方法都是一样的,具体可以参见MSDN。第一个方法是手动完成的,第二个方法则是交由预处理指令去自动完成的。
--克劳德曼
2012-8-6 15:41:15