31

我严格使用 C 和 WinAPI 编程,没有 C++ 或 C#。我是一个初学者,刚刚学习绘制控件等。问题是,当我创建 Windows 或其他控件(如命令按钮)时,它们具有 Windows Native 外观。看看这个:

这是我得到的样子!

但在 Windows 7 中,命令按钮如下所示:

在此处输入图像描述

现在,如何让我的程序中的命令按钮看起来像这样。甚至可能吗?我正在关注本教程,供参考:http: //zetcode.com/gui/winapi/

谢谢。

4

3 回答 3

24

这就是 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?再次出于向后兼容性的原因。细节很无聊。:-)

于 2011-04-14T12:33:01.113 回答
18

您可以通过提供 XML 清单(作为单独的文件或作为嵌入式资源)来为您的应用启用视觉样式。有关详细信息,请参阅启用视觉样式

于 2011-04-14T12:27:03.717 回答
14

您可能还记得当 Windows XP 以全新的外观出现时,您可以将其恢复为 Windows 95/2000 经典外观,或者您可以更改颜色主题。这被称为视觉样式,它为 Windows 带来了更好的主题支持。

Classic、Luna、Aero 和 Metro

从那时起,视觉风格一直是一个特征。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);
于 2014-06-24T02:39:13.020 回答