8 poin oleh GN⁺ 2024-07-01 | 7 komentar | Bagikan ke WhatsApp
  • Ringkasan hasil pencarian dan perbandingan library untuk menulis GUI di C++
  • Persyaratan dasar: hanya perlu dukungan Windows, boleh untuk penggunaan komersial, styling mudah dengan dark mode, menghasilkan satu file EXE di bawah 40MB dengan dependensi minimal, pengembangan cepat

WinUI 3

  • Awalnya tampak seperti pilihan yang sangat bagus
  • Bisa menggunakan komponen Windows modern dan menyesuaikan warna style
  • Bisa mendesain dengan XAML dan bahkan langsung memakai desainer Visual Studio
  • Masalah:
    • Dukungan untuk mendistribusikan aplikasi dalam bentuk unpackaged tidak terlalu baik
    • Saat aplikasi dipindahkan ke VM atau komputer lain, sebagian besar gagal dijalankan
    • Harus menyertakan banyak file .dll untuk menangani fitur WinUI
    • Tidak bisa membuat satu file .exe portabel
    • Tidak ada masalah bila dipakai dalam bentuk paket, tetapi akan terpasang sebagai paket AppX sehingga muncul masalah akses ke Win32 API

Win32 / MFC / library kecil yang membungkus Win32

  • Karena butuh portabilitas tinggi, masuk akal untuk memakai rendering bawaan OS
  • Program bisa menjadi satu file .exe dan ukurannya juga bisa sangat kecil (jika MFC di-static link)
  • Bisa memakai library yang lebih minimal yang sudah ditulis orang lain
  • Masalah:
    • Sangat sulit melakukan styling pada kontrol Win32 bawaan
    • Harus menulis fungsi custom paint untuk semua kontrol
    • Ada dark mode "tersembunyi" yang dipakai Windows File Explorer, tetapi hanya mencakup sebagian kontrol dan tampilannya pun masih kurang bagus

Qt

  • Cawan suci GUI C++
  • Kompleks, tetapi bisa diberi style dengan mudah menggunakan Qt Style Sheets
  • Masalah:
    • Jika ditautkan secara dinamis, ada sangat banyak .dll yang dibutuhkan untuk menjalankan aplikasi dan ukurannya melebihi 40MB
    • Qt bisa ditautkan secara statis ke program, tetapi karena lisensi LGPL Qt, Anda harus menjadikannya open source atau mendistribusikan object file agar bisa dikompilasi ulang
    • Atau bisa membeli lisensi komersial, tetapi biayanya ribuan dolar

wxWidgets

  • Library yang mudah dipelajari
  • Bisa menggunakan wxFormBuilder
  • Lisensinya lebih longgar daripada Qt dan bisa di-static link ke executable 3MB
  • Masalah:
    • Di Windows, ia memakai komponen Win32 bawaan dan tidak menyediakan opsi styling
    • Mendukung penerapan dark control ala Windows File Explorer, tetapi hasilnya kurang bagus

hikogui

  • Library GUI retained mode baru yang memakai Vulkan sebagai backend
  • Memiliki dark mode bawaan dan mudah diberi style
  • Masalah:
    • Untuk bisa mengompilasinya dengan sukses, rasanya perlu gelar doktor ilmu komputer
    • Setelah mencoba mengompilasi contoh selama lebih dari 30 menit, yang didapat hanya executable yang langsung crash karena access violation di dalam library Vulkan

Sciter

  • Alternatif yang bagus untuk Electron, yang memungkinkan menulis GUI aplikasi desktop dengan HTML/CSS
  • Masalah:
    • Ukuran aplikasi akhir sekitar 25MB bersama semua .dll, yang tampaknya akan jadi masalah tetapi masih bisa diterima
    • Akan lebih baik jika open source dan versi static link untuk komersial bisa digunakan
    • Tidak semahal Qt ($310), jadi rasanya rela membayar
    • Masalahnya, kualitas rendering-nya tidak terlalu bagus
    • Ada masalah aliasing pada font dan gambar
    • Jendelanya memiliki bingkai abu-abu yang cukup tebal (2-3px) yang tidak bisa dikustomisasi atau diubah

WinForms / WPF

  • Saat bertanya tentang library GUI C++, kebanyakan orang malah menyarankan memakai stack lain
    • Mereka bilang C++ adalah ide buruk, jadi frontend program sebaiknya ditulis dengan stack lain dan fungsionalitas yang ditulis dalam C++ dimuat sebagai komponen/modul
  • Bisa punya satu file .exe berukuran kecil dan menggunakan WinForms/WPF
  • .dll bisa dibundel sebagai resource aplikasi lalu diekstrak ke folder sementara, kemudian memakai P/Invoke untuk memanggil .dll terkompilasi dari dalam aplikasi C#/.NET, atau menggunakan C++/CLI
  • Masalah:
    • .NET Framework sudah terpasang sebelumnya di Windows 10 ke atas, jadi secara teknis memenuhi kriteria tanpa dependensi
      • Jika .dll dibundel, file itu tetap harus diekstrak ke suatu tempat dan perlu menulis kode tambahan agar P/Invoke bisa bekerja
      • C++/CLI dikompilasi menjadi kode .NET IL, sehingga terlihat seperti kode C++ yang diterjemahkan ke C#

Solusi?

  • Untuk aplikasi sederhana, sepertinya tidak ada yang lebih cocok daripada Dear ImGui
  • Kekurangannya terutama muncul saat merancang UI yang kompleks, dan karena ini bukan retained mode UI melainkan immediate mode UI, perlu menjalankan renderer GPU seperti DirectX untuk merender UI pada 60 frame per detik atau lebih
  • Namun selain itu, ia cocok dalam segala hal
  • Program hasil kompilasi hanya berukuran 500KB dan tidak perlu memasang VC++ Redistributable

Pendapat GN⁺

  • Seperti yang dikatakan penulis, tampaknya memang tidak ada library yang sempurna untuk pengembangan aplikasi GUI. Ada trade-off tergantung kebutuhannya
  • Untuk aplikasi sederhana, Dear ImGui tampak paling cocok, tetapi untuk membuat UI yang kompleks, mungkin lebih baik memakai toolkit GUI retained mode
  • Jika ingin membuat aplikasi komersial, biaya lisensi bisa menjadi pertimbangan penting. Library seperti Qt mahal, sedangkan wxWidgets bisa digunakan gratis
  • Membuat aplikasi GUI dengan C++ bukan pekerjaan yang mudah, jadi mungkin lebih realistis mengembangkan frontend dengan C# atau bahasa lain, lalu hanya mengimplementasikan bagian yang intensif performa dengan C++
  • Jika menginginkan native look-and-feel di Windows, WinUI atau MFC adalah pilihan yang baik, tetapi jika membutuhkan dukungan lintas platform, Qt atau wxWidgets mungkin pilihan yang lebih baik

7 komentar

 
tsboard 2024-07-05

hikogui memang sosok yang menakutkan ya wkwk

 
fastkoder 2024-07-03

https://getstream.io/blog/flutter-desktop-vs-electron/ membandingkan performa dengan berbagai metrik

 
fastkoder 2024-07-03

Jika dibandingkan dengan Sciter dan Electron, Flutter Windows Desktop Build juga layak dipertimbangkan. Memang ada plugin yang sesekali memiliki bug, tetapi fondasinya solid sehingga tetap bisa dimanfaatkan sebagai media penyampaian.
Singleton instance, pembaruan otomatis, status bar, notifikasi Windows, waktu peluncuran yang cepat, bahasa Dart, plugin Win32API, dan lain-lain

 
soone 2024-07-03

Delphi

 
soone 2024-07-03

C++ Builder

 
joyfui 2024-07-02

"Butuh gelar doktor ilmu komputer agar kompilasi bisa berhasil"
wkwkwk

 
GN⁺ 2024-07-01
Opini Hacker News
  • Setelah membaca banyak komentar, saya menyadari bahwa premis keseluruhannya keliru. Sebaiknya judul posting blog itu diubah menjadi "Menulis aplikasi GUI untuk Windows itu menyakitkan ketika persyaratannya tidak realistis"
  • Sebaiknya menargetkan WinForms dengan menggunakan .NET Framework 3.5. Semuanya sudah terpasang di semua versi Windows modern
  • Artikel ini memberi gambaran yang baik tentang berbagai opsi, tetapi persyaratan spesifik penulis menyingkirkan banyak opsi
    • Persyaratan yang menginginkan styling GUI yang sepenuhnya kustom tetapi tidak ingin menulis fungsi rendering sendiri pada akhirnya menjadi soal memilih pustaka GUI kustom yang mudah digunakan
    • Persyaratan executable mandiri dan batas ukuran di bawah 40MB juga menyingkirkan banyak opsi. Qt sebenarnya bisa memenuhi persyaratan ini, tetapi lisensi open source-nya tidak sesuai dengan tujuannya dan ia tidak ingin membeli lisensi
    • Jika dependensi eksternal diperbolehkan, ukuran unduhan yang lebih besar diperbolehkan, atau kontrol GUI bawaan Windows digunakan, situasinya akan sangat berbeda
    • Jika menginginkan GUI ringan yang sepenuhnya kustom tanpa dependensi eksternal dan menginginkan lisensi permisif, saya menduga ImGui adalah jawabannya
  • Menunjukkan bahwa tidak ada cacat besar pada gagasan WinForms/WPF, tetapi selain fakta bahwa itu membutuhkan dua stack, tidak banyak dibahas. Ia menginginkan kode native dan tidak ingin C# terlihat, tetapi tidak menjelaskan alasannya. Mungkin karena takut direkayasa balik. Kode UI jarang memuat rahasia
    • Distribusi single exe terkadang memang praktis, tetapi dalam skenario ini bisa merepotkan. Dengan menggunakan packager seperti Velopack (Squirrel), distribusi bisa dilakukan sebagai single exe dan juga menambahkan pembaruan otomatis. Memiliki dua file atau lebih di disk saat instalasi adalah kompromi yang baik
    • Windows adalah platform terburuk untuk mengembangkan aplikasi desktop dibanding semua platform lain
  • Saya memandang sangat rendah pengembang yang mengeluh harus membayar biaya lisensi komersial untuk pustaka perangkat lunak berlisensi LGPL. Mereka berharap dibayar atas pekerjaan mereka sendiri dan menjaminnya dengan membuat perangkat lunak closed source. Namun pengembang yang telah menyelesaikan bagian sulit yang sesungguhnya dari pembuatan pustaka UI justru diharapkan menjadi orang dewasa yang menghadiahkan kodenya secara cuma-cuma kepada dunia
  • Tentang Sciter dan masalah "anti-aliasing"... penulis tidak mengaktifkan dukungan DPI resolusi tinggi pada aplikasinya
    • Ini bisa diperbaiki dengan mengaktifkannya di Visual Studio atau menyertakan manifest yang sesuai
    • Dijelaskan dalam tutorial "Hello C++"
  • Lebih tepatnya:
    • "Portable" (single exe tanpa ekstraksi otomatis)
    • Bersifat komersial dan tidak ingin mendistribusikan ulang file objek hasil kompilasi (yang bersama persyaratan "portable" berarti LGPL tidak bisa diterima)
    • Dark mode
    • Aplikasi GUI Windows memang menyakitkan. Hapus salah satu dari persyaratan ini dan akan ada banyak opsi bagus
    • Sebagian besar aplikasi "portable" menggunakan win32. Biasanya aplikasi portable itu kecil dan sederhana, sehingga fungsi lebih penting daripada dark mode atau kemampuan styling lainnya
  • Sebagai orang yang menuntut banyak hal dari open source milik orang lain, penulis tidak berniat merilis solusinya sendiri sebagai open source
  • Saya sedang mengerjakan toolkit GUI yang sesuai dengan persyaratan itu: Slint - https://slint.dev
    • Bisa dikompilasi statis menjadi satu file .exe dengan ukuran di bawah 40M. Memiliki lisensi yang gratis digunakan di desktop. Menyediakan gaya gelap/terang. Juga mencakup editor drag-and-drop WYSIWYG (yang masih dalam pengerjaan)
  • Keharusan menulis fungsi paint kustom untuk semua kontrol menunjukkan bahwa filosofi win32 lama memang tidak cocok untuk penulis. Elemen inti win32 adalah wndproc. Sebagian besar kontrol menanyakan warna kepada parent-nya
    • Jika itu terasa tidak nyaman, membungkusnya dengan pustaka kecil untuk menghilangkan boilerplate bukanlah masalah besar
  • Hasil akhirnya harus berupa satu file .exe dengan tanpa dependensi atau dependensi seminimal mungkin, dan ukurannya harus di bawah 40MB
    • Komputer sekarang sudah memiliki browser modern. Alih-alih file .exe, bisa menggunakan satu file .html dengan gambar/css/javascript yang di-inline