在C + Win API中编程:如何让Windows 7寻找控件?

Ish*_*rma 29 c windows winapi button visual-styles

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

这是我得到的样子!

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

在此输入图像描述

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

谢谢.

Cod*_*ray 24

在主题(视觉风格)被发明之前,这就是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
Run Code Online (Sandbox Code Playgroud)

这篇MSDN文章提供了有关您可能想要的视觉样式的更多信息.


如果您确实希望应用程序看起来像本机,则需要更改用于主窗口的背景画笔.默认情况下,它设置为使用与文本框背景相同的颜色(白色).

您想要使用用于绘制3D控件的颜色.修改hbrBackground您的WNDCLASS(或WNDCLASSEX)结构的成员,如下所示:

wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
Run Code Online (Sandbox Code Playgroud)

你为什么要加1?出于向后兼容的原因,再次.细节很无聊.:-)

  • @Ishan:你实际上可以将代码放在任何你想要的地方,`stdafx.h`只是一个建议,因为它包含在默认模板中.它用于预编译头文件,如果你将来要创建任何非平凡的应用程序,你可能想要习惯它.代码只是告诉编译器自动创建和插入清单.这完全是关于那个表现.很高兴你能搞清楚! (2认同)

GSe*_*erg 18

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


Ren*_*lva 14

您可能还记得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>
Run Code Online (Sandbox Code Playgroud)

如果您选择嵌入选项,请不要忘记winuser.h包含在资源文件中.WinMain根据MinGW指南,您可能还想初始化您的公共控件DLL :

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

INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
Run Code Online (Sandbox Code Playgroud)