越接近你正在编程的金属(可以这么说),事情就越困难。WinForms(由 .NET Framework 提供)是对 Win32 API 的一个非常出色的抽象,考虑到您已经看到它涉及的复杂性,即使是最简单的任务,比如让一个窗口出现在屏幕上。当然,所有这些仍然在后台进行(注册窗口类、创建窗口等),您只是不必自己编写代码。
有趣的是,您将 Mono 视为“hack”,但会考虑使用 Qt 之类的库。我真的不确定你是根据什么做出区分的。Mono 库在 WinForms 支持方面被广泛认为是出色的。最大的批评者与微软自己的 CLR 实现相同,即它不会生成真正的本地代码,这在大多数情况下与性能无关,比人们想象的要多。除此之外,有些人抱怨 Mono 应用程序不完全符合平台的 UI 指南(也就是说,它们的外观和行为与本机应用程序完全不同),但我对使用 Qt 编写的应用程序也有类似的抱怨。
如果您想在 C++ 中进行 GUI 工作,似乎每个人都建议使用 Qt。正如我上面提到的,它恰好不是我最喜欢的库,因为我是一个坚持使用由您当前运行的平台提供的完全本机控件和小部件的人。我知道 Qt 最近在这方面有所进步,但我仍然认为它不符合我的标准。如果您比我更灵活(我会警告您,普通 Mac 用户并不比我更灵活),并且真正的平台独立性是您的一个大问题,那么您可能应该选择它. 许多人称赞它的设计优雅和方便,尽管我严重怀疑它是否提供与 .NET Framework 的实现相同的简单性。
如果代码的简单性和简洁性与您的问题开头听起来一样重要,我强烈建议您坚持使用 C# 和 WinForms。当您开始删除抽象层时,事情变得更加困难,如果您不需要这样做为您提供的额外控制级别,那么几乎没有任何理由为自己做更多的工作。假设您的需求相对适中,Mono 的 Forms 实现是跨平台应用程序的完美可行的解决方案。
除此之外,如果你想以正确的方式在 C++ 中创建一个真正的跨平台应用程序,我建议你将数据层代码与 UI 层严格分开,然后使用每个平台提供的工具编写 UI。支持。在 Windows 中,您的选择相对开放:.NET WinForms 是一个可靠的选择,本机 Win32 是一个有点痛苦但值得选择的选择,而 MFC 和 WxWidgets 等少数其他库可以帮助减轻完全本机编程的痛苦(尽管不是几乎和 WinForms 一样)。在 Mac 上,唯一真正的选择是针对 Cocoa 框架的 Xcode、Interface Builder 和 Objective-C。基于 Linux/Unix 的系统很难我的强项,但我知道 Qt 是一个尽可能原生的库。这听起来比我想象的要多——一个设计良好的库应该处理 80% 的工作,而在实现 UI 时只剩下大约 20% 的工作。除了使用真正的原生控件和小部件之外,我认为这种方法提供的另一大优势是灵活性。请注意,Microsoft Word 在 Windows 上的外观与在 Mac 上的外观非常不同(尽管有一些表面上的相似之处)。而 iTunes 在 Mac 平台上几乎成为了优秀 UI 设计的典范,但在 Windows 上却像大拇指一样突出。另一方面,如果你在 Mac 上推出了类似 Windows Media Player 的东西(是的,微软自己也尝试过,但没有取得多大成功),Mac 用户会将其视为完全可憎的东西,并且可能会因为您尝试过而感到被冒犯。对于真正具有跨平台意识的开发人员来说并不是那么好。综上所述,如果您的应用程序不是最简单的实用程序,您可能会发现在您想要支持的每个平台上,完全不同的界面是合理的(甚至是预期的)。
无论 Qt 有多么出色,你都不会得到它。