我在C和WinAPI中严格编程,没有C++或C#。我是一个初学者,只是学习绘制控制等。事情是,当我创建Windows或其他控件,如命令按钮,他们有Windows Native的外观。看看这个:在C + Win API中编程:如何让Windows 7查找控件?
而在Windows 7中,命令按钮看起来是这样的:
现在,我怎么命令按钮在我的计划看起来像那。它甚至有可能吗? 我正在关注本教程,仅供参考:http://zetcode.com/gui/winapi/
谢谢。
我在C和WinAPI中严格编程,没有C++或C#。我是一个初学者,只是学习绘制控制等。事情是,当我创建Windows或其他控件,如命令按钮,他们有Windows Native的外观。看看这个:在C + Win API中编程:如何让Windows 7查找控件?
而在Windows 7中,命令按钮看起来是这样的:
现在,我怎么命令按钮在我的计划看起来像那。它甚至有可能吗? 我正在关注本教程,仅供参考:http://zetcode.com/gui/winapi/
谢谢。
您可以通过提供XML清单(作为单独文件或嵌入资源)为应用程序启用视觉样式。详情请参阅Enabling Visual Styles。
这就是在主题(视觉样式)被发明之前,控制器在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
This MSDN article有比你所能想在视觉样式的更多信息。
如果你真的想你的应用程序以查找本地的,您需要更改用于主窗口的背景刷。默认情况下,它设置为使用与文本框背景相同的颜色(白色)。
改为使用用于绘制3D控件的颜色。修改您的WNDCLASS
(或WNDCLASSEX
)结构的hbrBackground
成员如下所示:
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
你为什么要加1?出于向后兼容的原因,再次。细节很无聊。 :-)
感谢您的回答! :)我不包括stdafx.h,所以我只是通过清单。你对颜色的建议真的很有帮助!只是修复了背景的白色! – 2011-04-14 12:45:13
@Ishan:实际上你可以将代码放在任何地方,'stdafx.h'只是一个建议,因为它包含在默认模板中。它用于预编译头文件,如果您将来要创建任何不平凡的应用程序,您可能会习惯这些内容。代码只是告诉编译器自动创建并插入清单。这都是关于那个清单。很高兴你能弄明白! – 2011-04-14 12:47:02
我不知道!谢谢。 – 2011-04-14 13:19:45
您可能还记得Windows XP时到达与全新的外观,你可以将其恢复到Windows 95/2000经典外观,或者你可以改变颜色主题。这被称为visual styles,它给Windows带来了更好的主题支持。
视觉样式remained as a feature至今。 Windows Vista和7中引入的Aero,但他们仍然采用了经典的主题允许的。Windows 8已经删除了Aero和经典主题,并添加了Metro主题。高对比度主题现在成为视觉样式的一部分,并且不再具有经典外观。
因此,Windows 7中一个经典的主题应用程序,当它被预期为Aero风格时,与应用程序的视觉风格有关。我不确定为什么,但是微软在将API迁移到新外观时没有离开旧的经典主题可选。
那么,我该如何运用现代风格呢?
无论哪种方式this MSDN article说明如何启用为您的应用视觉样式。我看到有人说启用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
公共控件DLL,根据this MinGW guide:
我已经看到了这一步在一些例子中错过了,它可以导致在特定的操作系统版本和某些一些奇怪的行为条件,例如按钮不可见,或对话框无法创建。
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
非常感谢快速回复!现在,我的应用看起来完全像我想要的。 – 2011-04-14 12:34:42