使用 Window API,如何确保控件保持原生外观?

Posted

技术标签:

【中文标题】使用 Window API,如何确保控件保持原生外观?【英文标题】:Using the Window API, how do I ensure controls retain a native appearance? 【发布时间】:2010-09-11 19:35:21 【问题描述】:

我创建的一些控件似乎默认为旧的 Windows 95 主题,我该如何防止这种情况发生?下面是一个不保留操作系统本机外观的按钮示例(我使用 Vista 作为我的开发环境):

HWND button = CreateWindowEx(NULL, L"BUTTON", L"OK", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                                  170, 340, 80, 25, hwnd, NULL, GetModuleHandle(NULL), NULL);

我正在使用带有 Windows API 的本机 C++,没有托管代码。

【问题讨论】:

【参考方案1】:

要将清单添加到应用程序,您需要创建一个 MyApp.manifest 文件并将其添加到应用程序资源文件:

//-- This define is normally part of the SDK but define it if this 
//-- is an older version of the SDK.
#ifndef RT_MANIFEST
#define RT_MANIFEST              24
#endif

//-- Add the MyApp XP Manifest file
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "MyApp.manifest"

对于较新版本的 Visual Studio,项目设置中有一个 Manifest Tool 选项卡,并在此找到了 Additional Manifest Files 字段选项卡也可用于定义清单文件。

这是一个用于 Win32 应用程序的简单 MyApp.manifest 文件:

<?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.1"
    processorArchitecture="X86"
    name="Microsoft.Windows.MyApp"
    type="win32"
/>
<description>MyApp</description>
</assembly>

如果您的应用程序依赖于其他 dll,这些详细信息也可以添加到清单中,Windows 将使用此信息来确保您的应用程序始终使用这些依赖 dll 的正确版本。

例如,这里是通用控件和 8.0 版 C 运行时库的清单依赖项详细信息:

<dependentAssembly>
    <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="X86"
        publicKeyToken="6595b64144ccf1df"
        language="*"
    />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity
        type="win32"
        name="Microsoft.VC80.CRT"
        version="8.0.50608.0"
        processorArchitecture="x86"
        publicKeyToken="1fc8b3b9a1e18e3b" />
</dependentAssembly>

【讨论】:

【参考方案2】:

我相信它与您的代码无关,但您需要设置一个适当的 ma​​nifest 文件来获取主题控件。

这里有一些信息:@msdn.com 和这里:@blogs.msdn.com

您可以在这里看到有和没有清单的应用程序之间的区别:heaventools.com

【讨论】:

以上是关于使用 Window API,如何确保控件保持原生外观?的主要内容,如果未能解决你的问题,请参考以下文章

使用 FLTK API,如何找到全屏高度?

WPF自定义控件の重写原生控件样式模板

Google Maps API 3 fitBounds 填充 - 确保标记不会被覆盖控件遮挡

在WPF中如何实现image控件填充整个窗体

duilib控件与属性说明

使用 Callkit 接听电话后如何保持原生 UI