Windows GUI:我可以从 C++ 访问“现代 ui”吗?

我试图找到一个简单问题的答案:我可以使用现代 UI——你在 Windows 10 中看到很多,它也受到黑暗主题的影响——来自 C/C++?

我知道 Win32 API 窗口不受深色主题的影响,至少在大多数情况下是这样。如果 .NET Windows Forms 受到影响并且 UWP 使用这个称为 CX 的奇怪 C++ 子集,我也没有找到明确的线索?我有点困惑。

基本上,我只想选择正确的 API 来使用 Windows 10 中常用的现代 UI 元素来设计我的 GUI。原因之一是这些控件已经可以正确访问 - 这是其他 GUI 框架实际上可能缺乏的。 (我自己有视力障碍,因此使用 NVDA 进行了粗略的测试,因为我的大多数朋友都依赖这些工具。)

stack overflow Windows GUI: Can I access the "modern ui" from C++?
原文答案

答案:

作者头像

使用 WinUI API: https://learn.microsoft.com/en-us/windows/apps/winui/winui3/ 注意:您可以将它与 c++ 一起使用,而不是与 c 一起使用。

作者头像

我想您所需要的只是启用视觉样式。默认情况下,Win32 应用程序看起来像 Windows 98/2000 GUI。要将窗口边框切换为 WinXP/7/10 样式,您需要添加内容简单的清单文件并使用 InitCommonControls()InitCommonControlsEx() 初始化公共控件库(comctl32.dll)。请参阅以下文章:

https://learn.microsoft.com/en-us/windows/win32/controls/cookbook-overview https://www.codeproject.com/Questions/58606/How-do-you-get-XP-visual-styles-manifest-to-work-o

简而言之,您需要执行 3 个步骤:

1.将comctl32.lib添加到你的项目中;
2、在 InitCommonControls(); 中调用 InitCommonControlsEx (或 WinMain );

  1. 嵌入清单文件或包含一个扩展名为 .manifest 且名称与您的 .exe 相同的文件。请参阅 Visual Studio 项目属性(其他清单文件)中的 Manifest Tool 条目。

示例清单文件:

<?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>Application Description</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    processorArchitecture="*"
    publicKeyToken="6595b64144ccf1df"
    language="*"
/>
作者头像

Windows 中的 "modern" UI 框架(从未命名)最初仅适用于面向通用 Windows 平台 (UWP) 的应用程序。后来它通过 XAML islands 可用于经典桌面应用程序。后来仍然决定将 UI 框架与操作系统分离,以便更改可以独立于操作系统更新发布。这就是成为 WinUI 2 的原因。在 WinUI 3 中,它计划完全分离,使 UI 立即可用于经典桌面应用程序。

整个 API 图面作为 Windows 运行时类型公开。虽然您可以在 ABI 级别与这些类型进行交互(这是 WRL 所做的),但使用创造的 language projection 更方便。最初,它是 C++/CX,一种由 Microsoft 编译器实现的非标准语言扩展,后来被 C++/WinRT 取代, 是一种在标准 C++ 中实现的语言投影。

所以是的,可以在 C++ 的经典桌面应用程序中使用新的 UI 框架。尽管必须指出,在 IDE 集成方面,C++/WinRT 仍然无法与 C++/CX 相提并论,尤其是 XAML 创作和绑定。仍然有可能,但有时会更乏味。