在C + +的API编程:如何获得Windows 7的控制?

我严格编程C和WinAPI,没有C + +或C#。 我是一个初学者,只是学习绘制控制等。事情是,当我创buildWindows或其他控件,如命令button,他们有Windows Native的外观。 看看这个:

这是看我得到!

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

在这里输入图像说明

现在,我如何获得我的程序中的命令button,看起来像这样。 这甚至有可能吗? 我正在学习本教程,以供参考:http: //zetcode.com/gui/winapi/

谢谢。

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

在20世纪90年代,在主题(视觉样式)被发明之前,这就是控制的回顾。 正如你已经注意到,现代的按钮,现在所有花式裤子渐变和跳动,所有这一切。 但是出于向后兼容的原因,你必须特别要求你的控制得到这种待遇,否则他们会回落到传统风格。

你通过指定一个清单来做到这一点。 您可以将纯文本格式添加到应用程序的根目录,也可以让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控件的颜色。 修改WNDCLASS (或WNDCLASSEX )结构的hbrBackground成员,如下所示:

 wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 

为什么你必须添加1? 出于向后兼容的原因,再次。 细节很无聊。 🙂

您可能还记得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 根据MinGW指南 ,您可能还想要初始化WinMain的通用控件DLL:

在某些示例中,我已经看到这一步错过了,并且在某些操作系统版本和某些条件下(如按钮不可见或者创建对话框失败)会导致一些奇怪的行为。

 INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&icc);