请 windows 开发大佬指点下, 我想学习一种微软支持的开发桌面 exe 程序得方式

2023-10-07 10:49:01 +08:00
 iorilu

说实在的, 虽然折腾不少框架, 库啥的

但这么多年却没有正经学过微软的任何语言或框架, 原因就不讨论了

但我现在想做正统的 windows 本地桌面程序开发, 想请 windows 开发经验多的人指点下, 省的走弯路, 省点时间

我虽然没搞过, 但大概也知道, 就算微软支持的东西也很多, 比如 winform ,wpf , 语言也一大堆 我说下我的目的和要求

希望得到具体点的意见 比如用啥语言 , 用啥框架, 怎么搭环境等

定好了直接开干。

6249 次点击
所在节点    程序员
74 条回复
smilenceX
2023-10-07 20:55:48 +08:00
WPF + C#, 符合你要求列表中的所有条目。
zhuangzhuang1988
2023-10-07 21:09:38 +08:00
WPF
工具成熟
AvaloniaUI 工具还是有点问题
pppguest3962
2023-10-07 21:22:23 +08:00
以前看过 Win MFC ,在 Win2000 、WinXP 时代,用纯正统 Win32 API 做一个窗体按钮出来,从头开始的话,很有可能是一个程序员半整天的工作量。。。
不知道 MFC 被微软丢进柜子里后,2023 年用什么角色来担当这个事情了,
要小巧,要快,始终还是 Win32 API ,实在是太麻烦了。。。
idealhs
2023-10-07 21:36:52 +08:00
@ysc3839 #36 C++编译器升级无法提升 win32 api 的性能,.NET 升级则能提升 WPF 框架性能。增加功能当然是增加.NET API 给你用。当然这些争执是无益的,Windows 下 GUI 开发选择 WPF 早就是标准答案,没有任何其他方式的开发效率,开发体验以及功能效果能够与之媲美。
idealhs
2023-10-07 21:39:45 +08:00
@pppguest3962 要小要快一直是 Winform 在做
ragnaroks
2023-10-08 00:35:29 +08:00
blazor-desktop ,纯 csharp ,发布到 edge-webview2 ,唯一的问题是新手大概要被 blazor 的一些特性绕几天
ragnaroks
2023-10-08 00:37:26 +08:00
对了,如果开发时间宽裕的话,可以用 unity3D 做,挺多人用 unity3D 做跨平台图形界面应用程序的,但是个人账户发布的制品在启动时会显示 unity3D 的标识。
ShadowPower
2023-10-08 02:40:48 +08:00
@pppguest3962
今天的电脑和 Win2K 时代的电脑相差特别大,消费者的需求也变了。
那个时代 GUI 程序绘图全靠 CPU 处理,当时的主流分辨率还是 640x480 ,而且很多电脑的“显卡”用途真的就只是为了显示画面,没有加速绘图的能力。

MFC 、Win32 API 、GDI+都是那个时代背景下的产物。

而今天很多人都在用 4K 分辨率的显示器,还希望用触摸板滚动界面时能按像素滚动,滚完了还有惯性。软件界面要有丰富且流畅的动画。如今那么多人喜欢 macOS ,有很大一部分因素就是这个。

所以微软不可能做一个全新的 MFC ,它已经不适合这个时代了。这种技术越多,Windows 的用户体验反而越差。

现代的 Windows GUI 应用,绘图的部分都是 Direct2D 、DirectWrite 、Direct3D ,能利用 GPU 加速渲染。还能分担 CPU 的负担。
这样才能实现在超高分辨率下平滑滚动等过去都不敢想象的需求。

MFC 提供的其他与界面无关的功能,后来被.NET 平台完全取代了。
因为这些东西早已成为 Windows 的一部分,所以上层应用同样可以“小巧”。

如果仍然想用 MFC 、Win32 API 开发,其实依然可以用,用起来还是那个味道。但对于大多数应用来说,开发成本高,用户体验差。也许很省内存,但今天的内存十分廉价,甚至不如用这廉价的内存去省下其他更昂贵的东西。怎么想都觉得划不来。


如果只是想做个无比简单的小工具,那么,用 WinForm 随便拖个界面,双击各种按钮填上代码,分分钟就糊出来了……
ysc3839
2023-10-08 05:16:20 +08:00
@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 。
usauk1998
2023-10-08 05:31:20 +08:00
用汇编语言
ladypxy
2023-10-08 06:34:33 +08:00
你这是点名 c#
xingjue
2023-10-08 06:45:59 +08:00
wails golang 写的
janus77
2023-10-08 07:19:41 +08:00
不用 c++ 官方支持 依赖尽量少,这三点下来根本不剩几个了。
iorilu
2023-10-08 07:54:04 +08:00
感谢各位大佬 , 经汇总各方面建议 , 现在基本确定两个方案

- 用标准 c# + WPF , 都是正统微软支持的技术, 但唯一问题在于不跨平台
- react native for Windows, 可以跨平台, 也算微软支持的方案, 可用 web 技术, 但不支持老点的系统

我后面可能会做这两个方案各做一个简单图形界面的 demo , 再确定长期使用的方案

很有价值 , 至少不会没方向了
klo424
2023-10-08 08:23:27 +08:00
想想十年前的 WPF 刚问世不久有很多人吐槽,现今的 WPF 已经是.NET 界的扛把子了。
buxudashi
2023-10-08 08:24:56 +08:00
aardio 你试试
haohaolee
2023-10-08 08:30:04 +08:00
感谢各位回帖的同学把 Windows 的 W 大写了,强迫性真难受
haohaolee
2023-10-08 08:39:03 +08:00
其它乱七八糟不论,Xaml 确实是好文明
macha
2023-10-08 08:41:28 +08:00
楼主还忘记说要支持哪些 Windows 平台了。
这个也非常的关键。
iorilu
2023-10-08 08:58:25 +08:00
@macha 主流就行, 也没想着非要兼容老的

win10 以上就可以了

毕竟开发方面, 兼容老的就意味这软件包更大, 开发更复杂, 等等问题, 往往不划算, 就和浏览器一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/979408

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX