使用Window API,如何确保控件保留原生外观?
-
02-07-2019 - |
题
我创建的一些控件似乎默认使用旧的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 ++,没有托管代码。
解决方案
我认为它与您的代码无关,但您需要设置一个正确的清单文件来获取主题控件。
此处提供的一些信息: @ msdn.com 和此处: @ blogs.msdn.com
您可以在此处看到有和没有清单的应用程序之间的区别: heaventools.com
其他提示
要向应用程序添加清单,您需要创建一个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 字段tab也可用于定义清单文件。
这是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>
不隶属于 StackOverflow