在C + Win API中进行编程:如何获取Windows 7的控件?

| 我严格用C和WinAPI编程,没有C ++或C#。我是一个初学者,只是学习绘制控件等。问题是,当我创建Windows或其他命令(如“命令按钮”)时,它们具有Windows本机外观。看看这个: 但是在Windows 7中,命令按钮如下所示: 现在,如何在程序中获取命令按钮,使其看起来像这样。可能吗 我正在关注本教程,以供参考:http://zetcode.com/gui/winapi/ 谢谢。     
已邀请:
您可以通过提供XML清单(作为单独的文件或作为嵌入式资源)来为应用程序启用视觉样式。有关详细信息,请参见启用视觉样式。     
这就是控件在主题(视觉样式)发明之前的1990年代的样子。正如您已经注意到的那样,现代按钮现在已在所有花式裤子上涂上渐变色和th动的颜色。但是出于向后兼容的原因,您必须明确要求控件得到这种处理,否则它们将退回到传统样式。 您可以通过指定清单来做到这一点。您可以将纯文本格式的一个添加到应用程序的根目录中,也可以使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迁移到新外观时,Microsoft没有保留旧的经典主题为可选。 那么,如何应用现代风格? 无论哪种方式,此MSDN文章都说明了如何为您的应用程序启用视觉样式。我见过有人说启用Unicode(定义
UNICODE
)会成功,但这不是必需的。基本上,您只需要编写一个清单文件,根据需要指定通用控件DLL的版本6,然后将其作为资源或位置嵌入可执行文件目录中的“ 7”下。清单清单如下所示:
<?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>
如果您选择embed选项,请不要忘记在资源文件中包含ѭ9。根据此MinGW指南,您可能还想在ѭ10中初始化公共控件DLL:   在某些示例中,我已经忽略了此步骤,在某些操作系统版本和某些条件下(例如,按钮不可见或对话框无法创建),它可能会导致某些奇怪的行为。
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
    

要回复问题请先登录注册