我正在用Visual C ++的资源编辑器创build一个对话框。
当我运行编辑器的testingbutton时,对话框的组件以现代的外观显示,而当运行创build和显示对话框的应用程序时,它以旧的样子显示…我只是使用WINAPI调用显示对话框,而不是MFC。 下面是屏幕截图(上图是UIdevise时间的示例,另一个是用户界面在运行时的外观):
链接文本
有谁知道我在做什么错?
提前致谢,
亨利
您的应用程序清单是否指定要使用comctl32.dll版本6? 这是在Windows XP中使用视觉样式和更现代的外观的要求之一。
创建清单并使您的应用程序能够使用视觉样式。
链接到ComCtl32.lib并调用InitCommonControls(请参阅MSDN库中的平台SDK文档)。
将名为YourApp.exe.manifest的文件添加到具有以下XML格式的源代码树中:
<?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="X86" name="CompanyName.ProductName.YourApp" type="win32" /> <description>Your application description here.</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
将清单添加到应用程序的资源文件中,如下所示
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
注意:当您将以前的条目添加到资源时,您必须将其格式化为一行。 或者,您可以将XML清单文件放在与应用程序的可执行文件相同的目录中。 操作系统将首先从文件系统加载清单,然后检查可执行文件的资源部分。 文件系统版本优先。
你有一个清单正确设置使用版本6的commctl32.dll在您的项目? 否则,你将无法获得主题控件。
在更高版本的Visual Studio中,通常使用#pragma来完成,就像这样(这个是从x86生成的,用VS2005生成的新项目复制):
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
如果将其添加到项目中的某个源文件并重建,清单将由链接器生成并添加到您的应用程序中。 对于其他处理器体系结构,您需要更改“processorArchitecture”值。 (为什么VS不能为自己弄清楚这是一个留给读者解决的谜团…)
(正如其他人已经注意到的那样,你也可以手动生成清单并将其添加到.rc文件中,这是比较冗长的,但却可以完全控制清单的内容。)
一旦应用程序绑定到Comctl32.dll的6.0版,一些Windows窗体控件将假定他们的新伪装。
以及如何使用Windows窗体上的控件使用Windows XP视觉样式中介绍的方法
我有一个VC6的解决方案,但我不知道它是否会在VS 2008中工作。
(也请查看这篇文章是为了什么导致问题)
下面是我用来解决这个问题的一个简单清单文件的例子:
创建下面的XML文件,
<?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="X86" name="Microsoft.Windows.YourApplication" type="win32" /> <description>YourApplication</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
首先,我们将两行添加到resource.h文件中。 只需复制并粘贴以下内容:
#define IDR_MANIFEST 1 #define RT_MANIFEST 24
现在,打开应用程序自定义资源文件。 通常,它位于res目录中; 默认扩展名是.rc2。 手动添加以下行:
// Add manually edited resources here... IDR_MANIFEST RT_MANIFEST MOVEABLE PURE "res\\ApplicationManifestXMLFile"
将ApplicationManifestXMLFile替换为实际的文件名(您创建的XML)。
这个问题指定了C ++, 这个问题显示了如何更干净地完成它。
对于.Net 2.0+,请参阅这篇MSDN文章<如何使用一行代码来做到这一点:
Main() { Application.EnableVisualStyles(); }
我希望这可以帮助搜索这个主题的人。
扩大现有的答案
MSDN: Windows Vista公共控件的构建要求
将下面的代码放入stdafx.h中对我很好,并且帮助在运行时显示VS对话框资源编辑器中显示的薄边框样式:
#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