【问题标题】:How to create a classic GUI with C++ [duplicate]如何使用 C++ 创建经典 GUI [重复]
【发布时间】:2017-04-03 17:50:23
【问题描述】:
有没有办法像 JavaFX 一样使用 cpp 创建经典 GUI?我想创建浮动按钮、表格、图表等元素。我知道 qt 之类的工具,但我不喜欢它。我尝试了 win32 API,但它仅适用于 Windows。
【问题讨论】:
标签:
c++
user-interface
javafx
【解决方案1】:
GUI 库通常被称为“小部件工具包”,并且有多种跨平台的 GUI 小部件工具包可供使用,但是对于出色的 UX,它们很少是一个好主意,因为不同的操作系统环境具有不同的 UI 范例(例如macOS 和 Ubuntu 如何在顶部有一个始终打开的菜单栏,而 Windows 和其他 Linux 桌面则没有)。
所以你有两个基本的选择:
- 使用单个跨平台 GUI 工具包 - 这意味着创建单个 GUI 项目,但将您限制在该工具包的控件和功能选择范围内,并且通常会使您的用户(相对)较差的用户体验,或者是因为您的工具包不使用本机小部件(例如 Java、WPF、Qt)或因为您无法使用平台的本机范例。
- 为每个平台编写一个新的本机 GUI。这意味着更多的工作,但更好的用户体验。
对于跨平台的 GUI 工具包,主要选项有:
对于三者之间的比较,请参阅此 QA:Which, if any, achieves Windows native look: GTK+, wxWidgets, Qt, FLTK?
(TL;DR:WxWidgets 使用本机控件但难以开发;Qt 提供了最佳的开发人员体验,但您需要注意许多其他要点)
对于您需要定位的每个平台的原生 UI,您需要熟悉每个 API:
- Win32:
- MFC(按照现代标准,API 很丑陋,但确实封装了主要的 Win32 UI 范例和 API,例如 Common Controls。但是,为支持现代 UI 功能(例如 High-DPI)做好准备、双向文本和高质量的 2D 渲染。GDI/GDI+ 即将淘汰,这意味着使用 Direct2D - 这很有趣,因为 MFC 采用 GDI)
- UWP/XAML:如果您的应用程序可以被沙盒化(并且只能在 Windows 10 上运行),那么您应该好好看看 UWP/XAML(它都是原生的,因此不涉及 CLR)。
- WPF:使用 WPF 可以更轻松地创建高质量的用户界面,如果您对自己的应用程序依赖于 .NET Framework 并用 C# 编写 UI 代码感到满意 - 但是 un- 的视觉美感皮肤 WPF 应用程序在 Windows 10 中急剧下降(即它们很丑),并且 WPF 的默认控件集非常缺乏 - 但如果你有能力(即时间、金钱、人员),那么你可以获得很好的结果 - 作为奖励WPF 的 XAML 通常可移植到 UWP。
- macOS:Cocoa - 在 C++ 中您将很难做到这一点。如果您的目标是 macOS,我强烈建议您使用 Swift(或 Objective-C,如果必须)编写您的 UI 层,然后使用 C++ 桥连接到您的应用程序代码的其余部分。
- Linux:由于 Linux 只是一个内核,因此“本机”小部件的集合取决于用户的桌面环境 - 但大多数桌面程序似乎都使用 GTK。而如果你要使用 GTK,那么不妨使用 GTK 的跨平台特性来支持 Windows 和 macOS。
总结:这很困难,而且工作量很大。 :) - 并解释了为什么今天(2017 年中)许多软件通常直接在网络上(例如 Facebook、StackOverflow、SalesForce)或使用 Electron (例如 Slack、VS Code、Atom)或一些托管 Web 视图构建为网络应用程序其他托管 webiew(PhoneGap 应用、Spotify 等)。