对话框在时间设计上具有现代外观,但在运行时具有旧外观(使用 Visual C++ 和资源编辑器)

Posted

技术标签:

【中文标题】对话框在时间设计上具有现代外观,但在运行时具有旧外观(使用 Visual C++ 和资源编辑器)【英文标题】:Dialog has a modern look on time design , but old look on run time (using Visual C++ and resource editor) 【发布时间】:2009-06-22 07:37:01 【问题描述】:

我正在使用 Visual C++ 的资源编辑器创建一个对话框。

当我运行编辑器的测试按钮时,对话框的组件以现代外观显示,而在运行创建和显示对话框的应用程序时,它以旧外观显示...我只是在使用WINAPI 调用显示对话框,而不是 MFC。

这是截图(上图是设计时的 UI 外观示例,另一张是运行时的 UI 外观):

link text

有谁知道我做错了什么?

【问题讨论】:

【参考方案1】:

您是否已正确设置清单以在您的项目中使用版本 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 文件中。这比较冗长,但确实让您可以完全控制清单的内容。)

【讨论】:

另一个设置它的选项是项目属性对话框。 VS2010 中的必需选项在 Configuration Properties - Linker - Manifest File - Additional Manifest Dependencies 下。 遵循@IvanNikitin 建议时要输入的确切值:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"(我花了一段时间才弄清楚)。 source【参考方案2】:

您的应用程序清单是否指定您要使用 comctl32.dll 版本 6?这是在 windows XP 中使用visual styles and a more modern look 的要求之一。

创建清单并使您的应用程序能够使用视觉样式。

链接到 ComCtl32.lib 并调用 InitCommonControls(请参阅 MSDN 库中的 Platform 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 清单文件放在与应用程序的可执行文件相同的目录中。操作系统会先从文件系统加载清单,然后检查可执行文件的资源部分。文件系统版本优先。

【讨论】:

【参考方案3】:

一旦应用程序绑定到 Comctl32.dll 的 6.0 版,某些 Windows 窗体控件就会呈现出新的外观。
Using Windows XP Visual Styles With Controls on Windows Forms 中描述了如何实现这一点

【讨论】:

【参考方案4】:

我有 VC6 的解决方案,但我不确定它是否适用于 VS 2008。 (也检查this article 是什么导致了问题)

这是我用来解决它的简单清单文件的示例:

创建以下 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)。

【讨论】:

【参考方案5】:

问题指定了 C++,this other question 展示了如何更简洁地做到这一点。

对于.Net 2.0+,请参阅>this MSDN article<了解如何用一行代码完成,即:

Main() 

    Application.EnableVisualStyles();

我希望这对搜索此主题的人有所帮助。

【讨论】:

【参考方案6】:

扩展现有答案...

MSDN:Build Requirements for Windows Vista Common Controls

将以下内容放入 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

【讨论】:

以上是关于对话框在时间设计上具有现代外观,但在运行时具有旧外观(使用 Visual C++ 和资源编辑器)的主要内容,如果未能解决你的问题,请参考以下文章

具有本机外观的 Miglayout 具有不同的行为

哪些因素控制对话框按钮的外观?

具有捕获和接受属性的 HTML 文件输入控件工作错误?

具有捕获和接受属性的 HTML 文件输入控件工作错误?

CMDIChildWnd在Windows-10上的外观和感觉

具有内部两个服务和依赖注入的外观 - 设计模式方法