2011-04-14 59 views
28

我在C和WinAPI中严格编程,没有C++或C#。我是一个初学者,只是学习绘制控制等。事情是,当我创建Windows或其他控件,如命令按钮,他们有Windows Native的外观。看看这个:在C + Win API中编程:如何让Windows 7查找控件?

​​

而在Windows 7中,命令按钮看起来是这样的:

enter image description here

现在,我怎么命令按钮在我的计划看起来像那。它甚至有可能吗? 我正在关注本教程,仅供参考:http://zetcode.com/gui/winapi/

谢谢。

回答

17

您可以通过提供XML清单(作为单独文件或嵌入资源)为应用程序启用视觉样式。详情请参阅Enabling Visual Styles

+0

非常感谢快速回复!现在,我的应用看起来完全像我想要的。 – 2011-04-14 12:34:42

22

这就是在主题(视觉样式)被发明之前,控制器在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?出于向后兼容的原因,再次。细节很无聊。 :-)

+0

感谢您的回答! :)我不包括stdafx.h,所以我只是通过清单。你对颜色的建议真的很有帮助!只是修复了背景的白色! – 2011-04-14 12:45:13

+2

@Ishan:实际上你可以将代码放在任何地方,'stdafx.h'只是一个建议,因为它包含在默认模板中。它用于预编译头文件,如果您将来要创建任何不平凡的应用程序,您可能会习惯这些内容。代码只是告诉编译器自动创建并插入清单。这都是关于那个清单。很高兴你能弄明白! – 2011-04-14 12:47:02

+0

我不知道!谢谢。 – 2011-04-14 13:19:45

14

您可能还记得Windows XP时到达与全新的外观,你可以将其恢复到Windows 95/2000经典外观,或者你可以改变颜色主题。这被称为visual styles,它给Windows带来了更好的主题支持。

Classic, Luna, Aero and Metro

视觉样式remained as a feature至今。 Windows Vista和7中引入的Aero,但他们仍然采用了经典的主题允许的。Windows 8已经删除了Aero和经典主题,并添加了Metro主题。高对比度主题现在成为视觉样式的一部分,并且不再具有经典外观。

因此,Windows 7中一个经典的主题应用程序,当它被预期为Aero风格时,与应用程序的视觉风格有关。我不确定为什么,但是微软在将API迁移到新外观时没有离开旧的经典主题可选。

那么,我该如何运用现代风格呢?

enter image description here

无论哪种方式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);