我严格使用 C 和 WinAPI 编程,没有 C++ 或 C#。我是一个初学者,刚刚学习绘制控件等。问题是,当我创建 Windows 或其他控件(如命令按钮)时,它们具有 Windows Native 外观。看看这个:
但在 Windows 7 中,命令按钮如下所示:
现在,如何让我的程序中的命令按钮看起来像这样。甚至可能吗?我正在关注本教程,供参考:http: //zetcode.com/gui/winapi/
谢谢。
我严格使用 C 和 WinAPI 编程,没有 C++ 或 C#。我是一个初学者,刚刚学习绘制控件等。问题是,当我创建 Windows 或其他控件(如命令按钮)时,它们具有 Windows Native 外观。看看这个:
但在 Windows 7 中,命令按钮如下所示:
现在,如何让我的程序中的命令按钮看起来像这样。甚至可能吗?我正在关注本教程,供参考:http: //zetcode.com/gui/winapi/
谢谢。
这就是 1990 年代控件在主题(视觉样式)发明之前的样子。正如你所注意到的,现代纽扣现在都被涂上了带有渐变和跳动的花哨的裤子等等。但是出于向后兼容的原因,您必须特别要求您的控件得到这种处理,否则它们将退回到旧样式。
您可以通过指定清单来做到这一点。您可以将一个纯文本格式的文件添加到应用程序的根目录,也可以让 Visual Studio(2005 及更高版本)自动将一个嵌入到您的 EXE 中。
第二条路线是我要走的路。将以下代码添加到您的stdafx.h
文件中,以通知编译器您希望它在构建项目时自动添加清单:
#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
这篇 MSDN 文章提供的有关视觉样式的信息比您想要的更多。
如果您真的希望您的应用程序看起来像原生,您需要更改用于主窗口的背景画笔。默认情况下,它设置为使用与文本框背景相同的颜色(白色)。
相反,您想使用用于绘制 3D 控件的颜色。修改hbrBackground
您的WNDCLASS
(或WNDCLASSEX
)结构的成员,如下所示:
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
为什么一定要加1?再次出于向后兼容性的原因。细节很无聊。:-)
您可以通过提供 XML 清单(作为单独的文件或作为嵌入式资源)来为您的应用启用视觉样式。有关详细信息,请参阅启用视觉样式。
您可能还记得当 Windows XP 以全新的外观出现时,您可以将其恢复为 Windows 95/2000 经典外观,或者您可以更改颜色主题。这被称为视觉样式,它为 Windows 带来了更好的主题支持。
从那时起,视觉风格一直是一个特征。Windows Vista 和 7 引入了 Aero,但它们仍然允许使用经典主题。Windows 8 删除了 Aero 和经典主题,并添加了 Metro 主题。高对比度主题现在是视觉风格的一部分,不再具有经典外观。
因此,Windows 7 中的经典主题应用程序在预期为 Aero 风格时,是应用程序视觉风格的问题。我不知道为什么,但微软在将 API 迁移到新外观时并没有让旧的经典主题成为可选。
那么,我该如何应用现代风格呢?
无论哪种方式,这篇 MSDN 文章都解释了如何为您的应用程序启用视觉样式。我见过有人说启用 Unicode(定义UNICODE
)会成功,但这不是必需的。基本上,您只需要编写一个清单文件,指定通用控件 DLL 的版本 6 作为要求,然后将其作为资源嵌入或放在appname.exe.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.0" processorArchitecture="*"
name="CompanyName.ProductName.YourApplication" type="win32"/>
<description>Your application description here.</description>
<dependency>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" type="win32" processorArchitecture="*"
publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
</assembly>
如果您选择嵌入选项,请不要忘记将其winuser.h
包含在您的资源文件中。WinMain
根据此 MinGW 指南,您可能还希望在您的 DLL 中初始化公共控件 DLL :
我已经看到在一些示例中遗漏了这一步,它可能会在某些操作系统版本和某些条件下导致一些奇怪的行为,例如按钮不可见或无法创建对话框。
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);