- C++ में GUI लिखने के लिए लाइब्रेरी खोजने और उनकी तुलना करने के नतीजों का सार
- बुनियादी आवश्यकताएँ: सिर्फ Windows support चाहिए, commercial use संभव हो, dark mode सहित आसान styling, न्यूनतम dependency के साथ 40MB से कम का single EXE बने, तेज़ development
WinUI 3
- शुरुआत में यह एक शानदार विकल्प लगा
- इसमें आधुनिक Windows components इस्तेमाल किए जा सकते हैं और style colors को customize किया जा सकता है
- XAML का उपयोग करके design किया जा सकता है और Visual Studio designer को सीधे इस्तेमाल भी किया जा सकता है
- समस्याएँ:
- app को unpackaged form में वितरित करने का support अच्छा नहीं है
- app को VM या किसी दूसरे कंप्यूटर पर ले जाने पर ज़्यादातर बार यह चलने में विफल हो जाता है
- WinUI features संभालने वाली कई .dll files साथ देनी पड़ती हैं
- single portable .exe file नहीं बनाई जा सकती
- package form में इस्तेमाल करने पर समस्या नहीं है, लेकिन यह AppX package के रूप में install होता है जिससे Win32 API access से जुड़ी समस्या आती है
Win32 / MFC / Win32 को wrap करने वाली छोटी libraries
- क्योंकि उच्च portability चाहिए, इसलिए OS के native rendering का उपयोग करना तर्कसंगत है
- program एक single .exe file हो सकता है और उसका आकार भी बहुत छोटा हो सकता है (MFC static link करने पर)
- कोई पहले से लिखी गई और भी minimal library इस्तेमाल की जा सकती है
- समस्याएँ:
- मूल Win32 controls को style करना बहुत कठिन है
- हर control के लिए custom paint functionality लिखनी पड़ती है
- Windows File Explorer में इस्तेमाल होने वाला एक "hidden" dark mode है, लेकिन उसमें सिर्फ कुछ controls शामिल हैं और वह अब भी अच्छा नहीं दिखता
Qt
- C++ GUI की holy grail
- जटिल है, लेकिन Qt Style Sheets का उपयोग करके इसे आसानी से style किया जा सकता है
- समस्याएँ:
- dynamic linking करने पर app चलाने के लिए बहुत सारी .dll files चाहिए होती हैं और आकार 40MB से ऊपर चला जाता है
- Qt को program के साथ static link किया जा सकता है, लेकिन तब open source करना पड़ता है या Qt के LGPL license के कारण recompile के लिए object files वितरित करनी पड़ती हैं
- या फिर commercial license खरीदा जा सकता है, लेकिन उसकी कीमत हज़ारों डॉलर है
wxWidgets
- सीखने में आसान library
- wxFormBuilder का उपयोग किया जा सकता है
- इसका license Qt की तुलना में अधिक permissive है और इसे static link करके 3MB executable बनाया जा सकता है
- समस्याएँ:
- Windows पर यह native Win32 components का उपयोग करता है और styling options नहीं देता
- Windows File Explorer dark controls लागू करने का support है, लेकिन वह खास अच्छा नहीं है
hikogui
- Vulkan को backend के रूप में इस्तेमाल करने वाली नई retained mode GUI library
- इसमें built-in dark mode है और style करना आसान है
- समस्याएँ:
- इसे सफलतापूर्वक compile करने के लिए मानो computer science में PhD चाहिए
- 30 मिनट से अधिक समय तक examples compile करने की कोशिश के बाद सिर्फ ऐसा executable मिला जो Vulkan library के अंदर access violation के साथ तुरंत crash हो गया
Sciter
- HTML/CSS का उपयोग करके desktop apps के लिए GUI लिखने वाला Electron का एक अच्छा विकल्प
- समस्याएँ:
- final app का सभी .dll files के साथ लगभग 25MB होना चिंता की बात लग सकता है, लेकिन स्वीकार्य है
- अगर यह open source होता और commercial use के लिए static link version इस्तेमाल किया जा सकता, तो और बेहतर होता
- Qt जितना महंगा नहीं है ($310), इसलिए इसके लिए पैसे देकर भी खुशी होती
- समस्या यह है कि rendering उतनी अच्छी नहीं है
- fonts और images में aliasing की समस्या थी
- window में काफ़ी मोटी (2-3px) gray frame होती है जिसे customize या modify नहीं किया जा सकता
WinForms / WPF
- C++ GUI library के बारे में पूछने पर ज़्यादातर लोग कोई दूसरा stack इस्तेमाल करने की सलाह देते हैं
- उनका कहना है कि C++ बुरा विचार है, इसलिए program का frontend किसी दूसरे stack में लिखो और C++ में लिखी functionality को component/module के रूप में load करो
- छोटा single .exe file रखा जा सकता है और WinForms/WPF इस्तेमाल किया जा सकता है
- .dll files को app resources में bundle करके temporary folder में extract कराया जा सकता है, फिर P/Invoke का उपयोग करके C#/.NET app के भीतर compiled .dll को call किया जा सकता है, या C++/CLI इस्तेमाल किया जा सकता है
- समस्याएँ:
- .NET Framework Windows 10 और उसके बाद के versions में preinstalled आता है, इसलिए तकनीकी रूप से यह no dependency मानदंड को पूरा करता है
-
- .dll को bundle करने पर उसे कहीं extract करना पड़ेगा और P/Invoke के काम करने के लिए अतिरिक्त code लिखना होगा
-
- C++/CLI .NET IL code में compile होता है, इसलिए C# में अनुवादित C++ code जैसा महसूस होता है
समाधान?
- सरल apps के लिए Dear ImGui से अधिक उपयुक्त कुछ नहीं लगता
- जटिल UI design करते समय इसके मुख्य नुकसान सामने आते हैं, और क्योंकि यह retained mode UI नहीं बल्कि immediate mode UI है, इसलिए UI के लिए प्रति सेकंड 60 frame या उससे अधिक render करने हेतु DirectX जैसे GPU renderer को चलाना पड़ता है
- लेकिन बाकी लगभग हर मामले में यह उपयुक्त बैठता है
- compiled program का आकार सिर्फ 500KB है और VC++ redistributable install करने की भी ज़रूरत नहीं होती
GN⁺ की राय
- जैसा कि लेखक ने कहा, GUI app development के लिए कोई परफेक्ट library शायद मौजूद नहीं है। आवश्यकताओं के अनुसार trade-off करना पड़ता है
- सरल apps के लिए Dear ImGui सबसे उपयुक्त लगता है, लेकिन जटिल UI बनानी हो तो retained mode GUI toolkit का उपयोग करना बेहतर होगा
- commercial app बनानी हो तो license cost एक महत्वपूर्ण विचार हो सकती है। Qt जैसी libraries महंगी हैं, जबकि wxWidgets मुफ्त में इस्तेमाल की जा सकती है
- C++ में GUI app बनाना आसान काम नहीं है, इसलिए frontend को C# या किसी दूसरी भाषा में develop करना और performance-intensive हिस्सों को ही C++ में implement करना ज़्यादा व्यावहारिक हो सकता है
- अगर Windows पर native look-and-feel चाहिए तो WinUI या MFC बेहतर विकल्प हो सकते हैं, लेकिन cross-platform support चाहिए तो Qt या wxWidgets अधिक अच्छे विकल्प बन सकते हैं
7 टिप्पणियां
hikogui काफ़ी डरावनी चीज़ है, बहुत बहुत
https://getstream.io/blog/flutter-desktop-vs-electron/ विभिन्न मेट्रिक्स के आधार पर परफॉर्मेंस की तुलना
Sciter और Electron की तुलना करें तो Flutter Windows Desktop Build भी विचार करने लायक है। कभी-कभी कुछ plugins में bugs होते हैं, लेकिन इसकी बुनियाद मजबूत है, इसलिए delivery माध्यम के रूप में इस्तेमाल करना संभव है.
singleton instance, auto update, status bar, Windows notifications, तेज launch time, Dart भाषा, Win32API Plugin वगैरह
Delphi
C++ Builder
"Compile सफल होने के लिए Computer Science में PhD चाहिए"
हाहाहा
Hacker News राय