windows下gui开发方案

先说结论

桌面端开发建议使用以下技术组合

  • 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

Author: chacebai
Link: http://www.spyhex.com/2023/windows下gui开发方案/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.