【问题标题】:Programming In C + Win API: How To Get Windows 7 Look For Controls?在 C + Win API 中编程:如何让 Windows 7 查找控件?
【发布时间】:2011-08-05 12:09:32
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: c windows winapi button visual-styles


    【解决方案1】:

    这就是 1990 年代控件在主题(视觉样式)发明之前的样子。正如你所注意到的,现代纽扣现在都被涂上了带有渐变和跳动的花哨的裤子等等。但出于向后兼容的原因,您必须明确要求您的控件得到这种处理,否则它们将退回到旧样式。

    您可以通过指定清单来做到这一点。您可以将一个纯文本格式的文件添加到应用程序的根目录中,也可以让 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,所以我只是通过清单。你关于颜色的建议真的很有帮助!刚刚修复了背景的白色!
    • @Ishan:您实际上可以将该代码放在您想要的任何位置,stdafx.h 只是一个建议,因为它包含在默认模板中。它用于预编译的标头,如果您将来要创建任何重要的应用程序,您可能想要习惯它。并且代码只是告诉编译器自动创建和插入清单。这都是关于那个清单的。很高兴你能弄明白!
    【解决方案2】:

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

    【讨论】:

    • 非常感谢您的快速回复!现在,我的应用看起来和我想要的完全一样。
    【解决方案3】:

    您可能还记得当 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 包含在您的资源文件中。您可能还想根据this MinGW guide 初始化WinMain 中的公共控件DLL:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2021-03-27
      • 2011-12-19
      • 2013-03-06
      • 2018-09-15
      • 2011-07-25
      相关资源
      最近更新 更多