先说结论
桌面端开发建议使用以下技术组合
- Qt(C++) 性能高,效果好,跨平台,开发效率低(C++的锅)。
- WPF(C#) 性能适中,效果好,不跨平台,开发效率中等,占内存。
- Electron(NodeJS) 性能低,效果好,跨平台,开发效率高,占内存,三方库支持少。
现在很多新应用都已经使用Electron来开发了,需要高性能的使用node-ffi调用原生即可。不建议使用Python+QT(或其他框架)来做客户端,我是使用了一段时间放弃了,打包大,性能也不高,关键是相关的文档也少,出现问题找解决方案都难。
如果性能要求不高的应用建议使用Electron,性能要求高点的用WPF或Qt(C++)。
Windows 下的 GUI 方案
Windows 下的 GUI 解决方案比较多:
- 基于 C++ 的有 Qt、MFC、WTL、wxWidgets、DirectUI、Htmlayout;
- 基于 C# 的有 Winform、WPF;
- 基于Chromium和Node.js的Electron;
- 基于 Java 的有 AWT、Swing;
- 基于 Pascal 的 有Delphi;
- 基于Go语言的有 walk
- 还有国内初露头角的 aardio;
- Visual Basic 曾经很流行,现在逐渐失去了色彩;
现在常用的方案
- Duilib+CEF 只支持Windows的选择,优点是打包文件小(使用C++) QQ、微信、有道精品课。
- Qt+CEF 支持跨平台,缺点是打包文件大(使用C++)。
- WPF/(WPF+CEFSharp) 打包文件小,但是性能相比前两者弱,但比Electron强,内存占用高,只支持Windows。
- Electron 打包文件大,但是性能弱,内存占用高,支持跨平台。
几种方案都各有利弊,可以根据团队的情况选用,都是相对不错的,其他的方案比如Flutter,Java就不太推荐。
C++阵营
QT和Duilib
QT和Duilib区别
Duilib是一款windows的下界面库,采用skia自绘的方式完成控件的显示,目前是开源状态,类似的控件库还有soui
而Qt则不是界面库那么简单,还包含有数据库,web,com通讯,tcpip通讯等等功能,应该称之为开发框架,并且包含了强大的ui系统。
Qt虽然开源,但是商业需要购买许可,duilib则不需要。
从稳定性上来说qt无疑是最为成熟和稳定的界面开发库,但是程序的运行依赖库较大,需要带上30~40M的qt基础库。
界面实现效果上两则区别不大,都可以实现比较丰富的界面外观,但是duilib的文档和资源较少,对开发人员的要求比较高。
此外如果涉及跨平台开发的话,duilib则无法胜任,只能支持windows下界面开发。
Qt自带的控件样式比较简单,可以通过qss进行控件美化,但是效果比较简单,这里可以尝试使用qt-ui界面库进行样式扩展,实现更加丰富的界面效果。
Qt-UI 是对qt控件的一种扩展,支持所有原生qt控件的接口和文档,可以帮助qt界面开发人员实现高质量的软件界面。
用 Qt 来开发 Windows 桌面程序有以下优点:
- 简单易学:Qt 封装的很好,几行代码就可以开发出一个简单的客户端,不需要了解 Windows API。
- 资料丰富:资料丰富能够成倍降低学习成本,否则你只能去看源码,关于 DirectUI、Htmlayout、aardio 的资料就很少。
- 漂亮的界面:Qt 很容易做出漂亮的界面和炫酷的动画,而 MFC、WTL、wxWidgets 比较麻烦。
- 独立安装:Qt 程序最终会编译为本地代码,不需要其他库的支撑,而 Java 要安装虚拟机,C# 要安装 .NET Framework。
- 跨平台:如果你的程序需要运行在多个平台下,同时又希望降低开发成本,Qt 几乎是必备的。
缺点是:
- 商用需要付费
- 依赖库太多
- 体积中等
用 Duilib 来开发 Windows 桌面程序有以下优点:
- 使用xml进行界面绘制
- 完全开源,商用也没问题
缺点是:
- 使用的是gdi,无法抗锯齿,使用圆角按钮时使用的是HRGN剪裁区域进行绘制,不论gdi还是gdi+都无法抗锯齿
- dpi需要自己定义,没有原生支持,缩放150%就糊了
WindowsAPI
使用WindowsAPI的好处
- 占用内存少
- 兼容性超强
- 不依赖任何组件
使用WindowsAPI的坏处
- 仅有基础控件,使用麻烦
- 需要第三方控件时需要造轮子,面向过程开发
- 超级费时费力
WTL
WTL基本就是WindowsAPI的封装,使用了C++的模板和多继承,语法比MFC友好一些,不需要依赖任何第三方库,只需要把include文件夹包含进来即可使用,好处有
- 使用简单
- 等同于WindowsAPI编程
坏处等于WindowsAPI的坏处
- 仅有基础控件,使用麻烦
- 需要第三方控件时需要造轮子,面向过程开发
MFC
语法恶心,需要依赖MFC库,我基本使用WTL代替
RmlUi
未知
Sciter
未知
ImGui
未知
微软自家(Winform/WPF/UWP/WinUI)
Winform和WPF
WPF,即windows presentation foundation,windows呈现基础,属于.net framework3.0,是微软推出取代Winform的产品,能做到分离界面设计人员与开发人员的工作,提供多媒体交互用户图形界面,三大核心程序集是presentationcore、presentationFramework、windowsBase。
WPF和Winform最大的区别在于WPF底层使用的DirectX,Winform底层使用的是GDI+,所以WPF的图形界面上更胜一筹
GDI+(Graphics Device Interface)图形设备接口,它的主要任务是负责绘图程序之间的信息交换、处理,所有windows程序的图形输出
DirectX(Direct Extension)多媒体编程接口,加强3D图形和声音效果,有很多API组成。
按照性质分类可分为四大部分:显示部分,声音部分,输入部分和网络部分
按照性能分类 DirectX > gdi > gd+
WPF和UWP
Universal Windows Platform (UWP) 和 Windows Presentation Foundation (WPF) 是不相同的,虽然都可以做界面和桌面开发,但是 UWP 是一个新的 UI 框架,而且 UWP 是支持很多平台,至少比 WPF 多。
UWP要求系统为Win10
那么 UWP 可以使用什么写?
- xaml 的 UI 和 C#、VB 写的后台
- xaml 的 UI 和 C++ Native 写的后台
- DirectX 的 UI 和 C++ Native 写的后台
- JavaScript 和 HTML
那么网上怎么好多小伙伴说 UWP 的性能比 WPF 好?
因为 UWP 的渲染使用的是 DirectComposition 而 WPF 使用的 Desktop Window
虽然 WPF 渲染是通过 Dx9 但是最后显示出来是需要 Desktop Window Manager(DWM)。
WinUI
开发工具上默认是不能创建的,需要安装插件。不推荐。
怎么选择
可以分为基本控件是如何绘制的来选择。
如果希望使用系统自带的控件,特点是可以跟随Windows版本不同,会显示不同样式的控件,按钮。
可以选择的有:
Win32++ 代替纯Win32开发的 案例多 Sourceforge: https://win32-framework.sourceforge.net/
WinLamb 代替纯Win32开发的 目前不了解 案例少 GitHub: https://github.com/rodrigocfd/winlamb
wxWidgets: 跨平台 商业授权友好 体积小 运行快 Github: https://github.com/wxWidgets/wxWidgets
如果希望使用自绘控件,则一般都需要考虑抗锯齿,那么就必须要求框架支持Direct,OpenGL,特点是不论在什么系统上运行,都显示自绘的样式。
可以选择的有:
FLTK 体积小 跨平台 按钮不好看 Github: https://github.com/fltk/fltk
SDL2 这是个媒体库 但是不妨碍可以自己一点一滴绘制控件 https://github.com/libsdl-org/SDL
WinForm 学一下基础使用就够了,用它开发还不如用wxWidgets
Avalonia 目前代替WPF的最佳选择 运行比WPF快 还支持跨平台
不太推荐的框架:
不推荐QT的原因就是商用需要付费。
不推荐MFC的原因是微软可能自己都放弃了MFC,而且难用。
不推荐Electron的原因是打包体积太大。
不推荐WPF的原因是仅支持C#,经过测试之后结论是运行卡顿,占内存大。
要跨平台可以选择:FLTK wxWidgets SDL2 Avalonia
要兼容性好可以选择:WTL Win32++ WinLamb wxWidgets FLTK SDL2
要开发速度可以选择:WinForm Avalonia
要运行速度可以选择:WTL Win32++ WinLamb
要体积最小可以选择:Win32++ WinLamb FLTK wxWidgets