@
idealhs “C++编译器升级无法提升 win32 api 的性能”
这是废话, .NET 升级也无法提升系统 API 的性能。举 MFC 的例子是为了说明“经典永不过时”、“可以使用最新语言特性”这些理由并不能说明一个框架的好坏,Delphi 那套也符合这些,但是也很少人使用了。再者 MFC 许多功能也并非由 Win32 API 提供,比如 MFC 有 Ribbon UI ,是 MFC 自己实现的,而不是 Win7 加入的那套,那升级 C++ 以及编译器显然也可以提升 MFC 本身的性能。
曾经很长一段时间 Windows 下 GUI 开发是没有“标准答案”的,Windows 内置程序少有使用 WPF 的,而是使用 C++以及一个私有的界面库。微软自家的大型软件,似乎只有 Visual Studio 使用了 WPF ,而且还是主界面 WPF+部分界面 MFC 混合,Office 使用的是另一套跨平台的界面库。
.NET 系一直有一些细节问题。比如 Win7 只预装了 .NET 3.5 ,如果想免安装兼容 Win7-Win10 ,就得放弃一些新特性。WinForm 和 WPF 的主题风格和 Windows UxTheme 不一致,有种粗制滥造的感觉,比如 Win32 的 Common Control 基本都有一些过渡动画,WinForm 动画直接没了,WinForm 的菜单风格也与系统菜单不一致,WPF 更是完全没有使用 UxTheme ,而是自己搞了套主题,与系统主题相差较大,Qt 对系统主题的模仿都比 WinForm/WPF 细致得多。当然对于开发者来说开发效率是很高,主题也是要用第三方的,并不是什么问题,但在用户眼里,则是觉得 Windows 从来没有统一的界面风格,也做不到“程序包尽量小, 依赖尽量少”。
说个题外话,为什么长期以来 Windows GUI 程序如此割裂?个人认为根本原因是因为微软强推 .NET 。自 21 世纪以来,许多新的操作系统都自带一套丰富的 API 及开发框架,比如 macOS ,以及后来的 iOS 、Android 等,但 Windows XP 仍然只有老旧的 Win32 API 。Vista 发布前夕,有传言称新的系统将要引入 WPF 等全新的开发框架,结果发布后发现 WPF 等是与 .NET 平台捆绑的,而 .NET 则是比较独立于 Windows 的,Windows 本身的 API 及开发框架并没有得到升级,微软也没向 .NET 提供 Win32 API 的 SDK ,想要使用,就得自己写一大堆声明。结果就变成了,旧应用没法渐进式升级,要升级只能重写。开发者想要获得良好的开发体验,就只能使用 .NET ,而使用 .NET 又很难访问底层 Win32 API ,WPF 的界面风格又与 Windows 本身的主题不统一。结果就是开发者要不然用 .NET+第三方界面库,要不然用 C++ Win32 controls ,要不然用其他的一些界面库。反观 macOS ,Objective-C 语言可以直接兼容 C/C++,系统中有内置风格统一、好用的界面库,自然许多开发者会倾向于使用系统提供的而不是第三方的。
多年之后的 Win8 ,微软再一次犯了错误,虽然 Win8 终于在系统中加入了现代化的 API 及开发框架 / 界面库,但是绝大多数仅面向 Modern App(或者说 UWP),而 UWP 缺少许多经典好用的 Win32 API 。个人认为微软是想通过 UWP 变相强迫开发者为他们的移动平台开发应用,因为如果允许桌面的 UWP 应用使用传统 Win32 API ,那自然很难移植到移动平台上。然而砍掉 Win32 API 这种行为动摇了桌面应用的根基,时至今日 macOS 都不敢砍掉 POSIX API ,因此许多开发者就直接拒绝使用 UWP 。
在微软放弃移动平台之后,终于引入了 Xaml Island ,允许 Win32 应用使用 UWP 的界面库,开发者可以渐进式地把传统 C++ Win32 或者 .NET 应用的部分界面替换成 UWP Xaml 界面(WinUI),同时微软也在开发 React Native for Windows 以及 .NET MAUI 等跨平台框架,这些框架底层使用系统内置的界面库,能保持界面风格与系统统一,开发者可以使用自己熟悉的语言开发,不需要学习新的语言。因此“没有任何其他方式的开发效率,开发体验以及功能效果能够与之媲美”这话,随着新框架的推出而变得不再准确了。
个人推荐楼主使用 React Native for Windows ,因为背靠 WinUI ,有着与系统统一的风格,且系统内置界面库,不需要庞大的依赖 ( .NET 后续版本不再内置在系统中,需要单独安装或者随程序发布 ),后续也容易移植到其他平台。坏处则是不兼容老系统,应该至少要 Win10 1903 。