Dialog具有现代时间设计,但在运行时看起来很老(使用Visual C ++和资源编辑器)

时间:2009-06-22 07:37:02

标签: windows visual-studio-2008 visual-c++

我正在使用Visual C ++的资源编辑器创建一个对话框 当我运行编辑器的测试按钮时,对话框的组件以现代外观显示,而当运行创建并显示对话框的应用程序时,它以旧外观显示...我只是使用WINAPI调用显示对话框,而不是MFC。 以下是截图(上图是设计时UI外观的示例,另一个是运行时的UI外观):

link text

有谁知道我做错了什么?

提前致谢,
亨利

6 个答案:

答案 0 :(得分:5)

您是否已正确设置清单以在项目中使用commctl32.dll的第6版?如果没有,你将无法获得主题控制。

在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文件中。这更加冗长,但确实可以让您完全控制清单的内容。)

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

一旦应用程序绑定到Comctl32.dll版本6.0,某些Windows窗体控件将采用新的伪装。
以及如何实现这一点在{{3 }}

答案 3 :(得分:1)

我有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)。

答案 4 :(得分:0)

这个问题指的是C ++,this other question显示了如何更干净地完成它。

对于.Net 2.0+,请参阅>this MSDN article<了解如何使用一行代码执行此操作,即:

Main() 
{
    Application.EnableVisualStyles();
}

我希望这有助于搜索此主题的人。

答案 5 :(得分:0)

扩展现有答案......

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