如何从资源文件生成的Win32对话框中获取可视主题?

Bil*_*eal 4 c++ windows resources dialog

我在资源文件中定义了一个对话框.但是,它使用Windows 95样式按钮等.如何为这些控件使用视觉主题(即在XP及更高版本中添加的主题)?

In *_*ico 11

您需要将清单文件嵌入到可执行文件中,该文件告诉Windows您希望启用主题的控件版本(有专门针对此主题的MSDN文档).这实际上是出于兼容性原因,因为有些人真的喜欢编写混乱其他程序内部数据结构的程序.

在Visual C++中,最简单的方法可能是通过#pragma:

#pragma comment(linker,"/manifestdependency:\"" \
    "type='win32' " \
    "name='Microsoft.Windows.Common-Controls' " \
    "version='6.0.0.0' " \
    "processorArchitecture='*' "  \
    "publicKeyToken='6595b64144ccf1df' " \
    "language='*'\"")
Run Code Online (Sandbox Code Playgroud)

这会导致链接器将这样的内容添加到生成的清单文件中:

<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*" />
    </dependentAssembly>
</dependency>
Run Code Online (Sandbox Code Playgroud)

您还需要调用InitCommonControlsEx()以注册相应的控件类,否则将不会出现对话框.

正如Mark Ransom在下面的评论中提到的,Windows 2000忽略了主题清单,因此这应该仍然适用于Windows 2000,Windows XP和更高版本.此外,某些框架(如MFC)定义#pragma并为您执行初始化.

  • Windows 2000会忽略清单,因此您只需进行正确的初始化调用即可.http://msdn.microsoft.com/en-us/library/ff563660%28v=vs.85%29.aspx (2认同)