8 पॉइंट द्वारा GN⁺ 2024-07-01 | 7 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 टिप्पणियां

 
tsboard 2024-07-05

hikogui काफ़ी डरावनी चीज़ है, बहुत बहुत

 
fastkoder 2024-07-03

https://getstream.io/blog/flutter-desktop-vs-electron/ विभिन्न मेट्रिक्स के आधार पर परफॉर्मेंस की तुलना

 
fastkoder 2024-07-03

Sciter और Electron की तुलना करें तो Flutter Windows Desktop Build भी विचार करने लायक है। कभी-कभी कुछ plugins में bugs होते हैं, लेकिन इसकी बुनियाद मजबूत है, इसलिए delivery माध्यम के रूप में इस्तेमाल करना संभव है.
singleton instance, auto update, status bar, Windows notifications, तेज launch time, Dart भाषा, Win32API Plugin वगैरह

 
soone 2024-07-03

Delphi

 
soone 2024-07-03

C++ Builder

 
joyfui 2024-07-02

"Compile सफल होने के लिए Computer Science में PhD चाहिए"
हाहाहा

 
GN⁺ 2024-07-01
Hacker News राय
  • कई टिप्पणियाँ पढ़कर यह समझ आया कि पूरी मूल धारणा ही गलत थी। ब्लॉग पोस्ट का नाम बदलकर "जब requirements अवास्तविक हों, तो Windows के लिए GUI app लिखना दर्दनाक होता है" करना बेहतर होगा
  • WinForms को target करने के लिए .NET Framework 3.5 का उपयोग करना अच्छा रहेगा। यह Windows के सभी आधुनिक versions में installed होता है
  • यह लेख कई options का अच्छा overview देता है, लेकिन लेखक की खास requirements कई options को बाहर कर देती हैं
    • पूरी तरह custom GUI styling चाहिए, लेकिन अपनी rendering functions नहीं लिखनी हैं — यह requirement मूलतः आसान customization वाली GUI library चुनने का काम बन जाती है
    • self-contained executable और 40MB से कम size की requirement भी कई options को बाहर कर देती है। Qt इन requirements को पूरा कर सकता था, लेकिन उसका open source license लक्ष्य से मेल नहीं खाता था, और लेखक license खरीदना नहीं चाहता था
    • अगर dependencies स्वीकार हों, या बड़ा download size स्वीकार हो, या built-in Windows GUI controls इस्तेमाल किए जाएँ, तो स्थिति बहुत अलग होती
    • अगर external dependencies के बिना हल्का, पूरी तरह custom GUI चाहिए और permissive license भी चाहिए, तो मुझे उम्मीद थी कि ImGui इसका जवाब होगा
  • यह बताया गया है कि WinForms/WPF वाले विचार में कोई बड़ी खामी नहीं है, लेकिन दो stacks की ज़रूरत के अलावा और कुछ नहीं कहा गया। लेखक native code चाहता है और C# दिखना नहीं चाहिए, लेकिन इसका कारण नहीं बताता। शायद reverse engineering का डर हो। UI code में बहुत कम ही कोई secrets होते हैं
    • single exe deployment कभी-कभी सुविधाजनक होता है, लेकिन इस scenario में यह झंझट बन सकता है। Velopack (Squirrel) जैसे packager का उपयोग करने पर single exe के रूप में deploy किया जा सकता है और auto-update feature भी जुड़ जाता है। install होने के बाद disk पर दो या उससे अधिक files होना एक अच्छा समझौता है
    • बाकी सभी platforms को छोड़ दें तो desktop app development के लिए Windows सबसे खराब platform है
  • उन developers के बारे में मेरी राय बहुत खराब है जो LGPL-licensed software libraries के commercial license के लिए पैसे देने की शिकायत करते हैं। वे उम्मीद करते हैं कि उन्हें अपने काम का भुगतान मिले, और इसे सुनिश्चित करने के लिए closed-source software बनाते हैं। लेकिन UI library का सचमुच कठिन हिस्सा हल करने वाले developers को दुनिया को code मुफ़्त में देने वाला परिपक्व इंसान भी होना चाहिए
  • Sciter और "anti-aliasing" समस्या के बारे में... लेखक ने application में high-resolution DPI support enable नहीं किया था
    • इसे Visual Studio में enable करके या सही manifest शामिल करके ठीक किया जा सकता है
    • यह "Hello C++" tutorial में समझाया गया है
  • और अधिक सटीक रूप में:
    • "portable" (auto-extract के बिना single exe)
    • commercial होना है और compiled object files redistribute नहीं करनीं (यह "portable" requirement के साथ LGPL की अनुमति नहीं देता)
    • dark mode
    • Windows GUI apps दर्दनाक हैं। इन requirements में से कोई एक हटा दें, तो अच्छे options बहुत हैं
    • ज़्यादातर "portable" applications win32 का उपयोग करती हैं। आमतौर पर portable apps छोटी और simple होती हैं, जहाँ functionality, dark mode या दूसरी styling capabilities से ज़्यादा महत्वपूर्ण होती है
  • दूसरे लोगों के open source से बहुत अपेक्षाएँ रखने वाला यह लेखक, अपने खुद के solution को open source के रूप में जारी नहीं करना चाहता
  • मैं इन requirements के अनुरूप एक GUI toolkit पर काम कर रहा हूँ: Slint - https://slint.dev
    • इसे static compile करके single .exe बनाया जा सकता है और इसका size 40M से कम हो सकता है। इसका license desktop पर मुफ्त उपयोग की अनुमति देता है। यह dark/light styles देता है। इसमें (काम जारी है) drag-and-drop WYSIWYG editor भी शामिल है
  • हर control के लिए custom paint function लिखनी पड़े — यह दिखाता है कि पुरानी win32 philosophy लेखक के लिए उपयुक्त नहीं है। win32 का मुख्य तत्व wndproc है। ज़्यादातर controls parent से रंग पूछते हैं
    • अगर यह असुविधाजनक लगे, तो boilerplate हटाने के लिए इसे किसी छोटी library से wrap करना कोई बड़ी बात नहीं है
  • नतीजा एक ऐसी single .exe file होना चाहिए जिसमें dependencies न हों, या बहुत कम हों, और जिसका size 40MB से कम हो
    • अब computers में modern browser होते हैं। .exe file की जगह images/css/javascript inline की हुई single .html file का उपयोग किया जा सकता है