亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Windows 下的 GUI 開發(fā),真的太難了!多種方法開發(fā) GUI

admin
2024年7月8日 15:22 本文熱度 2394

近日,開發(fā)者 Samuel Tulach 在個(gè)人博客上感嘆道,“在 Windows 上編寫 GUI 應(yīng)用程序真是太難了!”在文中, Samuel Tulach 討論了使用 C++ 編寫 GUI 應(yīng)用的各種困難。他詳細(xì)列舉了幾種流行的庫(kù),但這些庫(kù)通常會(huì)面臨諸如依賴項(xiàng)管理、應(yīng)用程序大小以及樣式定制等問(wèn)題,并沒(méi)有完全契合的解決方案。

萬(wàn)萬(wàn)沒(méi)想到,這個(gè)小吐槽引起了不少開發(fā)者的共鳴,甚至登上了 HN 熱榜。接下來(lái),我們將通過(guò)本文看看難點(diǎn)究竟在哪里?

作者 | Samuel Tulach
編譯 | 蘇宓
出品 | CSDN(ID:CSDNnews)

過(guò)去幾天里,來(lái)自捷克的程序員 Samuel Tulach,一直在尋找一個(gè)能夠讓他用 C++ 編寫帶有 GUI 程序的庫(kù)。他給出的要求非常簡(jiǎn)單:

  • 只需要支持 Windows;

  • 允許商業(yè)用途;

  • 易于設(shè)計(jì),包括支持暗黑模式;

  • 結(jié)果應(yīng)該是一個(gè)單一的 .exe 文件,沒(méi)有或只有極少的依賴項(xiàng),大小不超過(guò) 40MB;

  • 編寫程序的 GUI 部分所花費(fèi)的時(shí)間不應(yīng)該比實(shí)際功能花費(fèi)的時(shí)間多。

所以,Samuel Tulach 開始挑選一些稱手的工具、框架,結(jié)果發(fā)現(xiàn)并沒(méi)有想象中那么簡(jiǎn)單。


WinUI 3

首先,Samuel Tulach 從專為 Windows 應(yīng)用程序開發(fā)而設(shè)計(jì)的現(xiàn)代化的用戶界面(UI)框架——WinUI 3 入手。

乍一看,它是個(gè)不錯(cuò)的選擇。它允許你使用現(xiàn)代的 Windows 組件,還可以自定義樣式顏色。設(shè)計(jì)方面,你可以使用非常容易掌握的 XAML,或者直接使用 Visual Studio 設(shè)計(jì)器。

WinUI 3 控件庫(kù)

問(wèn)題:使用 WinUI 3 框架開發(fā)的應(yīng)用程序在發(fā)布時(shí)不能以無(wú)包裝(unpacked)的形式進(jìn)行分發(fā)。這意味著無(wú)法將應(yīng)用程序打包為一個(gè)單獨(dú)的可執(zhí)行文件(.exe)及其所需的所有依賴項(xiàng),而是需要依賴于特定的分發(fā)方式,如打包為 AppX 包或者通過(guò) Microsoft Store 進(jìn)行分發(fā)。

對(duì)于 Samuel Tulach 而言,大多數(shù)情況下,當(dāng)他嘗試將應(yīng)用程序遷移到虛擬機(jī)或不同計(jì)算機(jī)時(shí),由于缺少一些不明依賴項(xiàng)而無(wú)法正常啟動(dòng)。更糟糕的是,你需要提供一堆處理 WinUI 功能的 .dll 文件,沒(méi)有辦法提供一個(gè)可移植的 .exe 文件。使用打包形式通常沒(méi)有問(wèn)題,但它們是以 AppX 包的形式安裝的,這本身就會(huì)帶來(lái)很多問(wèn)題(尤其是在需要訪問(wèn)所有 Win32 API 的情況下)。


Win32 / MFC / 封裝 Win32 的小型庫(kù)

緊接著,Samuel Tulach 將目光轉(zhuǎn)移到了 Win32 身上。Win32 是一種應(yīng)用程序編程接口(API),它是微軟 Windows 操作系統(tǒng)的核心組成部分。它提供了開發(fā)者與操作系統(tǒng)交互的一組標(biāo)準(zhǔn)接口和功能,用于創(chuàng)建和管理 Windows 應(yīng)用程序的各個(gè)方面,包括窗口、消息處理、文件操作、網(wǎng)絡(luò)通信等。

Samuel Tulach 表示,其需要高度的可移植性,因此使用操作系統(tǒng)的原生渲染是有道理的。這樣的程序可以是一個(gè)單一的 .exe 文件(因?yàn)槲覀儗?duì) MFC 進(jìn)行了靜態(tài)鏈接),而且體積超?。ㄖ挥袔浊ё止?jié))。

同時(shí),Samuel Tulach 稱,還可以使用別人已經(jīng)編寫好的更簡(jiǎn)約的庫(kù),這意味著從概念到可運(yùn)行應(yīng)用程序的快速實(shí)現(xiàn)將變得非常容易。

基本 Win32 形式

問(wèn)題:對(duì)原生的 Win32 控件進(jìn)行樣式化處理是一項(xiàng)非常困難的任務(wù)。為了改變這些空間的外觀和風(fēng)格,Samuel Tulach 需要為每一個(gè)控件編寫一個(gè)專門的自定義繪制函數(shù),這個(gè)過(guò)程不僅需要詳細(xì)了解 Win32 API 的繪制機(jī)制,還需要大量的時(shí)間和精力投入。

對(duì)此,Samuel Tulach 吐槽稱,“有這個(gè)時(shí)間,我都可以直接去養(yǎng)家糊口了。”

此外,Windows 文件資源管理器(File Explorer)使用的一些原生 Win32 控件具有一個(gè)被稱為 “隱藏” 的暗色模式。用戶可以激活這個(gè)模式,但它只會(huì)對(duì)部分控件生效,并且在視覺(jué)效果上并不十分理想或完善。


Qt

Qt 在 C++ 圖形用戶界面開發(fā)中被認(rèn)為是一個(gè)非常優(yōu)秀的選擇。盡管它相對(duì)復(fù)雜,但它提供了 Qt 樣式表(Qt Style Sheets),這使得開發(fā)者可以輕松地設(shè)計(jì)和定制界面的外觀和樣式。Qt 樣式表使用一種類似于 CSS 的語(yǔ)言,讓開發(fā)者可以用熟悉的方式來(lái)定義控件的外觀、布局和交互效果。

OBS studio 使用 Qt 和自定義樣式表

然而,問(wèn)題在于,當(dāng)使用動(dòng)態(tài)鏈接方式時(shí),運(yùn)行 Qt 應(yīng)用程序需要大量不同的 .dll 文件,這些文件總共的大小超過(guò)了 40MB。為了減少文件大小,可以選擇將 Qt 靜態(tài)鏈接到應(yīng)用程序中,這樣未使用的部分會(huì)被移除,從而減小應(yīng)用程序的體積。

不過(guò),Qt 使用的是 LGPL 許可證。根據(jù) LGPL 的條款,如果選擇靜態(tài)鏈接 Qt,那么必須遵守 LGPL 的要求之一:要么開源應(yīng)用程序的源代碼,要么提供用于重新編譯的目標(biāo)文件。另外,Qt 也提供了商業(yè)許可證選項(xiàng),可以以幾千美元的價(jià)格購(gòu)買,從而免除遵守 LGPL 條款的義務(wù),只是這樣成本又太高了。


wxWidgets

wxWidgets(https://www.wxwidgets.org/)是一個(gè)相對(duì)容易學(xué)習(xí)的庫(kù),還可以使用 wxFormBuilder。它所遵循的許可證要比 Qt 更寬松,可以靜態(tài)鏈接成一個(gè) 3MB 的可執(zhí)行文件。

wxWidgets 啟用了實(shí)驗(yàn)性的 Windows 暗模式選項(xiàng)

問(wèn)題:wxWidgets 是一個(gè)在 Windows 上使用原生的 Win32 組件的庫(kù)。然而,與直接使用 Win32 或 MFC 相比,wxWidgets 并沒(méi)有提供輕松覆蓋繪制函數(shù)的選項(xiàng),因此在樣式定制方面甚至比直接使用 Win32 或 MFC 更為困難。

盡管 wxWidgets 支持應(yīng)用 Windows 文件資源管理器的暗模式控件,但實(shí)際效果并不理想。


hikogui

hikogui(https://github.com/hikogui/hikogui)是一個(gè)相對(duì)較新的保留模式 GUI 庫(kù),它使用 Vulkan 作為后端技術(shù)。這意味著它利用 Vulkan 的強(qiáng)大功能來(lái)進(jìn)行圖形渲染和顯示。hikogui 內(nèi)置了暗模式的支持,開發(fā)者可以很容易地自行定制和樣式化界面,以適應(yīng)應(yīng)用程序的需求和設(shè)計(jì)風(fēng)格。

問(wèn)題:要成功編譯 hikogui,可能需要具備計(jì)算機(jī)科學(xué)博士學(xué)位,特別是在編譯器開發(fā)方面的專業(yè)知識(shí)。在體驗(yàn)過(guò)程中,Samuel Tulach 嘗試了超過(guò) 30 分鐘去編譯示例,包括嘗試不同的代碼分支和發(fā)布標(biāo)簽,但最終只得到了一個(gè)立即在某個(gè) Vulkan 庫(kù)內(nèi)發(fā)生訪問(wèn)沖突的可執(zhí)行文件,因此他決定放棄嘗試。 

不過(guò),盡管 Samuel Tulach 不太喜歡大量使用 STL(標(biāo)準(zhǔn)模板庫(kù)),甚至認(rèn)為有時(shí)候并不是必需的,但他認(rèn)為 hikogui 看起來(lái)確實(shí)有前景。


Sciter

Sciter 實(shí)際上是一個(gè)不錯(cuò)的 Electron 替代品,允許開發(fā)者使用 HTML/CSS 編寫桌面應(yīng)用程序的 GUI。

SVG 圖標(biāo)上抗鋸齒效果不佳的示例

問(wèn)題:你可能認(rèn)為應(yīng)用程序大小或稱為一個(gè)問(wèn)題,但實(shí)際上,包含所有必需的 .dll 文件的最終應(yīng)用程序大小大約只有 25MB,這對(duì) Samuel Tulach 來(lái)說(shuō)完全可以接受。

Samuel Tulach 表示,如果 Sciter 能夠完全開源,那將是更好的選擇,因?yàn)檫@樣開發(fā)者可以將靜態(tài)鏈接版本用于商業(yè)用途(與 Qt 的問(wèn)題相同)。同時(shí),Sciter 的獨(dú)立許可證價(jià)格相比 Qt 要低不少(目前為 310 美元),Samuel Tulach 也愿意為此支付費(fèi)用。

然而,現(xiàn)在不選用這個(gè)框架的主要原因在于,如上圖所示(看看標(biāo)題欄圖標(biāo)),渲染效果不太好。在體驗(yàn)過(guò)程中,Samuel Tulach 透露其遇到了各種字體和圖像的抗鋸齒問(wèn)題(啟用了高分辨率選項(xiàng),即使在預(yù)編譯的 scapp.exe 中也存在這個(gè)問(wèn)題)。而且,無(wú)論你做什么,窗口都會(huì)有一個(gè)相當(dāng)厚(2-3 像素)的灰色邊框,完全無(wú)法自定義或修改。


WinForms / WPF

如果你在一些論壇上詢問(wèn)關(guān)于在 Windows 上使用 C++ 編寫 GUI 庫(kù)的問(wèn)題,大概率會(huì)收到一些“這不是一個(gè)好主意”等類似的反饋,甚至論壇上的專家們會(huì)直接建議你采用其他技術(shù)堆棧來(lái)編寫應(yīng)用程序的前端部分,然后將用 C++ 編寫的功能作為組件或模塊加載進(jìn)來(lái)。

這種做法可以讓你更輕松地定制和風(fēng)格化界面,并顯著加快開發(fā)速度。從技術(shù)角度來(lái)看,確實(shí)可以使用像 WinForms 或 WPF 這樣的工具生成一個(gè)體積較小的單獨(dú)可執(zhí)行文件(.exe)。

詳細(xì)來(lái)看,有兩種方式可以實(shí)現(xiàn):

  1. 將動(dòng)態(tài)鏈接庫(kù)(.dll 文件)打包到應(yīng)用程序的資源中,然后在運(yùn)行時(shí)從應(yīng)用程序的資源中提取這些 .dll 文件到一個(gè)臨時(shí)文件夾中。接下來(lái),使用 P/Invoke 技術(shù)在 C#/.NET 應(yīng)用程序中調(diào)用這些從 .dll 編譯而來(lái)的庫(kù)文件。這種做法允許將 C++ 編寫的功能模塊作為 .dll 文件嵌入到 C# 或 .NET 應(yīng)用程序中,并在運(yùn)行時(shí)動(dòng)態(tài)加載和調(diào)用它們。

  2. 使用 C++/CLI。

問(wèn)題:.NET Framework 在 Windows 10 及更新版本中是預(yù)裝的,因此從技術(shù)上來(lái)說(shuō),我們?nèi)匀豢梢詽M足無(wú)依賴項(xiàng)的標(biāo)準(zhǔn)。然而,如果我們選擇將 C++ 編寫的功能模塊打包為 .dll 文件,我們?nèi)匀恍枰谶\(yùn)行時(shí)將這些 .dll 文件從打包的資源中提取到一個(gè)臨時(shí)位置,并編寫額外的 P/Invoke 代碼來(lái)調(diào)用這些模塊。

此外,如果使用 C++/CLI 編譯,生成的代碼將轉(zhuǎn)換為 .NET IL 代碼。換句話說(shuō),生成的應(yīng)用程序可以在調(diào)試工具(如 dnSpy)中打開,你可以看到 C++ 代碼被翻譯為等效的 C# 代碼。這種情況下,生成的應(yīng)用程序并不是純粹的原生代碼應(yīng)用程序,而是包含了.NET Framework 的中間代碼。

而正如文章伊始所提及的,Samuel Tulach 想要原生的代碼,所以基于 WinForms 或 WPF 得到的代碼并不他真正想要的。


解決方案?

以上是 Samuel Tulach 考慮過(guò)的幾個(gè)方案。經(jīng)過(guò)長(zhǎng)時(shí)間嘗試各種不同的庫(kù),甚至一度編寫自己的 MFC 樣式之后,Samuel Tulach 發(fā)現(xiàn)對(duì)于簡(jiǎn)單的應(yīng)用程序來(lái)說(shuō),沒(méi)有什么比 Dear ImGui 更合適的了。

Dear ImGui 是一個(gè)用于 C++ 的輕量級(jí)界面開發(fā)框架,它的主要目標(biāo)是提供高效、靈活和易于使用的界面開發(fā)工具。Dear ImGui 是一個(gè)基于文本的界面開發(fā)框架,它使用簡(jiǎn)單的文本命令來(lái)創(chuàng)建和更新用戶界面。

不過(guò),Dear ImGui 在設(shè)計(jì)復(fù)雜的用戶界面時(shí)也有一些缺點(diǎn),而且它不是保留模式的用戶界面,而是即時(shí)模式的用戶界面,因此想要使用,必須運(yùn)行像 DirectX 這樣的 GPU 渲染器來(lái)渲染每秒 60 幀或更多幀的用戶界面。

正如上圖所示,Samuel Tulach 已經(jīng)寫了一個(gè)示例,如何使用內(nèi)置的多視口功能來(lái)制作簡(jiǎn)單的圖形用戶界面應(yīng)用程序。

編譯后的程序大小只有500KB,非常小巧。這個(gè)程序不需要安裝任何額外的依賴項(xiàng),即使是將 MFC(Microsoft Foundation Classes)靜態(tài)鏈接到程序中,也不需要安裝 VC++(Visual C++)的運(yùn)行時(shí)庫(kù)。這使得部署和使用這個(gè)程序變得非常簡(jiǎn)便,用戶可以直接執(zhí)行這個(gè)程序而無(wú)需擔(dān)心缺少運(yùn)行時(shí)組件或依賴項(xiàng)。


對(duì)于 Samuel Tulach 這段經(jīng)歷,不少開發(fā)者感同身受。來(lái)自 HN 的網(wǎng)友 pshirshov 表示:

我也有過(guò)類似痛苦的經(jīng)歷。我需要一個(gè)真正跨平臺(tái)(Windows、Linux/Wayland、Mac、iOS、Android)的 GUI 工具包,它要有豐富的控件庫(kù)和合理的主題。事實(shí)上,唯一不錯(cuò)的選擇是 QT,而使用 C++ 很難提高效率,因?yàn)樗匀蝗狈竟δ?,如類型解?gòu)和帶窮舉檢查的 ADT/GADT。QT 與其他語(yǔ)言的綁定還不夠成熟。

除了 QT 之外,還有漏洞百出的 Avalonia。對(duì) Linux 的支持非常糟糕。

此外還有 Kotlin/Compose Multiplatform。它缺乏良好的文檔和先進(jìn)的控件,而且仍然充滿 Bug。

我無(wú)法找到任何適用于 JS/TS 的優(yōu)秀控件庫(kù),即使是付費(fèi)的控件庫(kù)(如 Telerik 和其他控件庫(kù))也非?;靵y。因此,Electron、Capacitor、React Native——它們都認(rèn)為即使是一個(gè)非?;镜膽?yīng)用程序也需要投入大量精力。

Flutter 給人的感覺(jué)極不成熟,尤其是全局單例模式的普及使得在使用 Flutter 時(shí),即使是管理小型代碼庫(kù)也變得非常困難。

另一用戶稱:

在 Mac 上我遇到同樣的困擾,我在 Mac 上 SwiftUI 的體驗(yàn)是,它仍需要大量工作。文檔很差。如果你以直截了當(dāng)?shù)姆绞阶鍪拢阅芸赡軙?huì)很差。支持舊版本的操作系統(tǒng)相當(dāng)痛苦等等。

至此,你是否體驗(yàn)過(guò) GUI 開發(fā)?有哪些工具推薦?

來(lái)源:

https://news.ycombinator.com/item?id=40839208

https://tulach.cc/writing-gui-apps-for-windows-is-painful/


該文章在 2024/7/8 15:22:48 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved