桌面程序开发框架选择

1、WinForm(Windows Form)

https://learn.microsoft.com/zh-cn/dotnet/desktop/winforms/overview/?view=netdesktop-8.0
从.NET Framework 2.0就有了,后来.NET Core没有放弃它,继续在维护。在很古老的系统上运行,特别是工控软件上

优点

  • 简单易用,学习曲线平缓;适合快速开发简单的桌面应用
  • 不挑系统,资源消耗低,可以在古老的系统上运行

缺点

  • 用户界面相对陈旧,不如现代框架灵活
  • 提供的UI控件较少,自定义和样式化的能力有限
  • 只能在Windows运行

2、WPF(Windows Presentation Foundation)

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/overview/?view=netdesktop-8.0
从.NET Framework 3.5就有了,后来.NET Core没有放弃它,继续在维护。界面优美,资源消耗高,可以很方便做出精美的主流C端程序

优点

  • 强大的UI自定义:WPF使用XAML描述界面,提供丰富的自定义和样式化能力,可以创建现代化和富有创意的用户界面。
  • 数据绑定和MVVM支持:WPF内置了强大的数据绑定功能,支持MVVM(Model-View-ViewModel)模式,使应用程序的开发更加灵活和可维护。
  • 矢量图形和动画效果:WPF支持矢量图形和动画效果,可以创建高质量的可视化效果。

缺点

  • 学习曲线较陡峭:WPF的学习曲线相对较陡峭,需要掌握XAML和一些复杂的概念。
  • 较高的资源消耗:由于WPF使用自己的渲染引擎,相比WinForm,WPF应用程序通常具有较高的资源消耗。
  • 只能在Windows运行

3、Electron

https://www.electronjs.org/zh/
Electron是一个基于Chromium和Node.js的框架,它通过将这两者合并到同一个运行时环境中,使得开发者可以使用Web技术来构建桌面应用程序,并能在Windows、macOS和Linux等多个平台上运行

优点

  • 跨平台支持:Electron可以将应用程序打包为可在不同操作系统上运行的可执行文件,提供了跨平台的能力。
  • 使用Web技术:Electron使用HTML、CSS和JavaScript开发应用程序,可以利用丰富的Web技术和生态系统资源。
  • 社区活跃:Electron拥有活跃的开发社区,有大量的插件和工具可供使用。
  • 丰富的API:提供了丰富的本地(操作系统)API,使得开发者可以使用纯JavaScript来创建桌面应用程序。
  • 上手难度低:前端开发者可以快速上手,因为Electron支持HTML、CSS和JavaScript等熟悉的Web技术。
  • 热更新:支持应用的在线更新,无需用户重新安装。
  • 调试和测试方便:可以使用Chrome开发者工具进行调试,并且支持多种测试框架。

缺点

  • 较大的应用程序体积:由于Electron需要打包包含Chromium浏览器引擎的应用程序,因此应用程序的体积较大。
  • 较高的资源消耗:由于Electron使用Chromium浏览器引擎,相比传统的桌面应用程序,Electron应用程序通常具有较高的资源消耗。
  • 安全性问题:用户可以通过开发者工具和ASAR源文件轻松访问源代码,存在潜在的安全风险。

4、Delphi

https://www.embarcadero.com/products/Delphi
主要用于开发 Windows 桌面应用程序,功能强大,效率高。最新版本逐步开始支持其他平台

优点

  • Delphi 的编译速度非常快,这使得开发过程更加高效;生成的可执行文件通常具有很高的运行时性能,因为它是编译成本地代码
  • Delphi 提供了一个丰富的可视化组件库(VCL),涵盖了从基本控件到高级控件的各种需求
  • Delphi 内置了对多种数据库的支持,包括 SQL Server、Oracle、MySQL 等;提供了丰富的数据访问组件,如 ADO、IBX、dbExpress 等,使得数据库操作更加方便
  • Delphi 的 FireMonkey 框架支持跨平台开发,可以在 Windows、macOS、iOS 和 Android 上运行(新版本开始支持其他平台)
  • Delphi 的 IDE 功能强大,提供了代码编辑、调试、版本控制等全方位的支持
  • Delphi 拥有一个活跃的开发者社区,提供了大量的教程、示例和第三方组件

缺点

  • 对于没有 Pascal 或 Delphi 经验的开发者来说,学习曲线可能较陡峭
  • 尽管 FireMonkey 支持跨平台开发,但 Delphi 的主要优势和大部分资源仍然集中在 Windows 平台上;其他平台可能存在性能、体验不友好的问题
  • 默认的 VCL 组件可能显得有些过时,尤其是在现代应用中追求更现代和美观的用户界面
  • 虽然 Delphi 有丰富的第三方库和组件,但相比于一些更流行的现代框架(如 .NET 或 Node.js),生态系统的多样性和活跃度可能略显不足
  • Delphi 是一个商业软件,购买许可证的成本可能较高,特别是对于小型开发团队或个人开发者

5、QT

https://www.qt.io/zh-cn/
QT是一个跨平台的C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,同时也可以开发不带界面的命令行(Command User Interface,CUI)程序。

优点

  • 支持 Windows、macOS、Linux、Android、iOS 等多个操作系统,使得开发一次代码即可在多个平台上运行
  • 提供了一致的 API 和用户界面风格,确保应用程序在不同平台上具有一致的行为和外观
  • 提供了大量的 GUI 控件,包括按钮、标签、列表框、表格等,满足各种用户界面需求
  • 可以轻松创建自定义控件,扩展和修改现有控件的功能
  • 提供了丰富的网络编程功能,支持 HTTP、FTP、WebSocket 等协议
  • 支持多种数据库(如 SQLite、MySQL、PostgreSQL 等),提供了简便的数据访问接口
  • 内置了多线程支持,简化了并发编程
  • 支持多语言和多区域设置,便于开发国际化应用
  • 使用 QML 语言,提供了一种声明式的编程方式,适合开发现代、动态的用户界面(实际上QML使用起来不是那么很和谐)
  • 支持丰富的动画和图形效果,可以创建视觉效果出色的用户界面
  • Qt 的编译器优化良好,生成的代码运行效率高
  • 提供了智能指针和自动垃圾回收机制,帮助开发者更好地管理内存
  • 官方文档和示例代码比较完善,社区活跃

缺点

  • 学习曲线可能较陡峭,首先C++就比较难,其次框架也是很复杂
  • 编译时间可能较长,特别是在大型项目中
  • 生成的可执行文件可能较大,特别是在包含大量模块和库的情况下
  • 虽然提供了免费的 LGPL 版本,但商业项目可能需要购买商业许可,费用可能较高
  • LGPL许可证要求任何修改后的 Qt 代码必须开源,这可能不适合所有商业项目
  • 虽然 QML 适合开发现代用户界面,但在某些高性能场景下,纯 C++ 实现可能更优
  • QT依赖于多个外部库和模块,管理这些依赖可能会增加项目的复杂性

6、MFC(Microsoft Foundation Class Library)

MFC(Microsoft Foundation Class Library)是一个用于开发 Windows 应用程序的 C++ 类库。MFC 是微软早期提供的一个框架,广泛用于开发 Windows 桌面应用程序。在实际开发中,常与QT进行比较,虽然现在貌似不怎么更新了,但是在一些特殊场景还是有用武之地;当时上学期间用VC6开发C语言的时候,MFC就存在了,现在还能用,经过了时间的检验,稳定性没得说

优点

  • MFC 提供了对 Windows API 的直接访问,使得开发者可以充分利用 Windows 操作系统的功能
  • MFC 包含了大量的类,涵盖了从基本的窗口管理到复杂的文档视图架构等多种功能
  • MFC 生成的代码通常具有很高的运行时性能,因为它直接编译成本地代码
  • MFC 提供了有效的资源管理机制,帮助开发者优化内存和系统资源的使用
  • MFC 有悠久的历史,积累了大量的教程、示例和第三方资源
  • FC 与宇宙第一IDE(Visual Studio)集成良好,提供了丰富的开发工具和调试功能,用社区版本Visual Studio,不用花钱就可以开发商业版本的程序

缺点

  • MFC 的学习曲线较陡峭,尤其是对于没有 C++ 经验的开发者
  • MFC 的用户界面组件相对陈旧,缺乏现代 UI 设计所需的丰富动画和图形效果
  • 微软对 MFC 的更新和支持不如以前频繁,新功能和改进较少
  • 用 MFC 开发的应用程序通常需要编写更多的代码来实现相同的功能,尤其是在处理复杂用户界面时
  • MFC 高度依赖于 Windows API,这使得应用程序难以移植到其他平台

7、JavaFX

https://openjfx.io/
基于 Java 构建的桌面、移动和嵌入式系统。这是许多个人和公司共同努力的结果,其目标是为开发富客户端应用程序生成一个现代、高效且功能齐全的工具包

优点

  • 控件丰富,支持CSS控制样式,FXML写布局,界面与业务分离
  • 跨平台,支持Windows、macOS 和 Linux,新版还支持移动设备;在不同平台上提供一致的用户界面和行为,减少了跨平台开发的复杂性
  • 提供了丰富的多媒体支持,可以播放音频和视频文件,支持多种格式;同时对于矢量图形、3D 图形的支持也很好
  • 支持双向数据绑定,可以轻松地将模型数据与用户界面控件绑定,减少手动同步的工作量
  • 提供了丰富的多线程支持,简化了并发编程,确保用户界面的响应性和流畅性
  • 官方文档齐全,社区活跃

缺点

  • 性能问题,Java通病,启动时间长,内存消耗多
  • 对于没有 JavaFX 经验的开发者来说,学习曲线可能较陡峭;如果有Java基础,开发过Swing程序,上手速度很快
  • 本同版本的功能有些微差别,需要对应的JDK
  • 生态圈还是比较小,不如.Net与Electron
  • Oracle 将 JavaFX 从 JDK 中移除后,交由社区维护,可能会存在更新慢等问题

8、Swing

Swing 是 Java 自带的一种图形用户界面(GUI)工具包。它继承自 AWT(抽象窗口工具包)

优点

  • 自带组件丰富,可以用来构建功能复杂的用户界面
  • 高度可扩展,开发者可以自定义组件和控件的外观和行为
  • 跨平台,不依赖于操作系统的本地 GUI,可以在不同的平台上提供一致的用户体验
  • 与 AWT 的重量级组件相比,Swing 中的大多数组件都是轻量级的,可以更快地渲染,体验更好

缺点

  • 学习曲线可能较陡峭,尤其是在复杂的应用开发中
  • 虽然 Swing 的组件是轻量级的,但在处理复杂 UI 时,性能可能会受到影响
  • Swing 不支持硬件加速,可能导致在图形密集型应用程序中的性能不足
  • 功能、性能等比不上新的框架,资料也不是很丰富

9、Avalonia

https://github.com/AvaloniaUI/Avalonia
一个基于.NET开源的跨平台 UI 框架。它具有类似 WPF 的能力,并支持 XAML,有WPF开发经验的很容易上手

优点

  • 跨平台,目前支持 Windows、macOS 和 Linux
  • XAML支持,界面绘制不用纯代码编写,可以直接使用XAML,跟WPF类似,支持 MVVM 模式
  • 社区活跃,资源丰富
  • 性能很高,开发的桌面应用非常流畅
  • 自定义控件非常方便

缺点

  • 虽然发展很快,但是成熟度不够,有很多bug未解决
  • 没有WPF开发经验的上手有难度,有WPF开发经验需要注意其中的差异点
  • 第三方支持的库和插件很少,一些个性化的东西需要自己实现
  • 相对于WPF,文档的数量与质量还是有待提高

10、Flutter

Google 开发的开源 UI 软件开发工具包,旨在帮助开发者构建跨平台的应用程序。它允许使用单一代码库创建适用于 Android、iOS、Web、桌面(Windows、macOS 和 Linux)等多种平台的高性能应用。早期主要是针对移动端,后期桌面端也开始支持

优点

  • 跨平台,使用同一套代码库,可以同时构建移动端应用,甚至桌面端应用
  • Flutter 直接编译为原生代码,通常比其他跨平台解决方案性能更佳,能提供接近原生的用户体验

缺点

11、MAUI (Multi-platform App UI)

Atom Shell 现已改名为 Electron atom-shell 是 GitHub 随 Atom 一起开源的跨操作系统(Windows,Linux,MacOS X)的利用 Web 技术(Node.js、JavaScript、HTML 5)开发桌面应用的框架。Atom即构建在 atom-shell 之上。 与 Node-Webkit 的区别 atom-shell 和Node-Webkit很像,那么两者有什么区别呢? 1. 程序入口 Node-Webkit 的程序入口是一个网页,你在package.json中指定主页,然后这个主页会在浏览器中打开,作为应用程序的主窗口。 atom-shell 的程序入口则是一个 JavaScript 脚本,而不是直接指定一个 URL。你需要手动创建浏览器窗口,并通过相应的 API 加载 html 文件。你同时需要监听窗口事件以便决定何时退出应用。 因此,atom-shell 更接近 Node.js 运行时,API 也更加底层,你可以利用 atom-shell 进行 web 测试,类似phantomjs。 2. 编译系统 atom-shell 使用libchromiumcontent访问 Chromium 的 Content API,这样编译 atom-shell 的时候就不用编译整个 Chromium (编译 Chromium 非常费时)。 顺便提一下,GitHub 开发者还创建了brightray库,让 libchromiumcontent 的使用更方便。 3. Node 集成 Node-Webkit 的 Node 集成需要给 Chromium 打补丁才能工作。atom-shell 通过集成 libuv loop 和 平台的 message loop 避免给 Chromium 打补丁。 4. Multi-context Node-Webkit 创造了 Node context 和 web context 的概念,而 atom-shell 没有引入新的 context,而是直接使用 Node 的 Multi-context 特性(这一特性是 Atom 开发者赞助 Node 添加的)。 作者 GitHub 最初考察了 Node-Webkit,但是最终还是决定雇佣@zcbenz来开发想要的框架。于是 atom-shell 诞生了。 一个最简单的 hello atom 示例项目请看 hello-atom 主程序示例: var app = require('app');  // Module to control application life. var BrowserWindow = require('browser-window');  // Module to create native browser window. // Report crashes to our server. require('crash-reporter').start(); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the javascript object is GCed. var mainWindow = null; // Quit when all windows are closed. app.on('window-all-closed', function() {   if (process.platform != 'darwin')     app.quit(); }); // This method will be called when atom-shell has done everything // initialization and ready for creating browser windows. app.on('ready', function() {   // Create the browser window.   mainWindow = new BrowserWindow({width: 800, height: 600});   // and load the index.html of the app.   mainWindow.loadUrl('file://'   __dirname   '/index.html');   // Emitted when the window is closed.   mainWindow.on('closed', function() {     // Dereference the window object, usually you would store windows     // in an array if your app supports multi windows, this is the time     // when you should delete the corresponding element.     mainWindow = null;   }); }); 支持很多桌面应用特性,例如 Dock 菜单等: 使用 Dock 菜单的方法: var app = require('app'); var Menu = require('menu'); var dockMenu = Menu.buildFromTemplate([   { label: 'New Window', click: function() { console.log('New Window'); } },   { label: 'New Window with Settings', submenu: [     { label: 'Basic' },     { label: 'Pro'},   ]},   { label: 'New Command...'}, ]); app.dock.setMenu(dockMenu); PS:网易也有开放了Hex,同样是不满意node-webkit,就自己做了套. 标签:AtomShell  GUI开发框架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值