- Zusammenfassung der Ergebnisse einer Recherche und eines Vergleichs von Bibliotheken zum Erstellen von GUIs in C++
- Grundanforderungen: nur Windows-Unterstützung erforderlich, kommerzielle Nutzung möglich, einfache Stilgestaltung inklusive Dark Mode, Erstellung einer einzelnen EXE-Datei unter 40 MB mit minimalen Abhängigkeiten, schnelle Entwicklung
WinUI 3
- Wirkte anfangs wie eine hervorragende Wahl
- Moderne Windows-Komponenten können verwendet und Stilfarben angepasst werden
- Das Design kann mit XAML erstellt werden, und auch der Visual-Studio-Designer lässt sich direkt nutzen
- Probleme:
- Die Bereitstellung der App in nicht paketierter Form wird nur schlecht unterstützt
- Beim Verschieben der App auf eine VM oder einen anderen Computer schlägt die Ausführung meist fehl
- Es müssen viele
.dll-Dateien mitgeliefert werden, die WinUI-Funktionen verarbeiten
- Eine einzelne portable
.exe-Datei kann nicht erstellt werden
- Als Paket funktioniert es problemlos, wird aber als AppX-Paket installiert, wodurch Probleme beim Zugriff auf die Win32-API entstehen
Win32 / MFC / kleine Bibliotheken, die Win32 wrappen
- Da hohe Portabilität benötigt wird, ist es sinnvoll, das native Rendering des Betriebssystems zu verwenden
- Das Programm kann aus einer einzelnen
.exe-Datei bestehen und sehr klein sein (bei statischem Linken von MFC)
- Man kann eine minimalistischere Bibliothek verwenden, die jemand anderes bereits geschrieben hat
- Probleme:
- Das Stylen nativer Win32-Controls ist sehr schwierig
- Für alle Controls müssen benutzerdefinierte Paint-Funktionen geschrieben werden
- Es gibt einen „versteckten“ Dark Mode, wie er im Windows-Datei-Explorer verwendet wird, aber er umfasst nur einige Controls und sieht trotzdem nicht besonders gut aus
Qt
- Der heilige Gral der C++-GUI
- Komplex, aber mit Qt Style Sheets leicht zu stylen
- Probleme:
- Bei dynamischem Linken werden zahlreiche
.dll-Dateien zum Ausführen der App benötigt, und die Größe liegt bei über 40 MB
- Qt kann statisch ins Programm gelinkt werden, aber dann muss man es Open Source machen oder wegen der LGPL-Lizenz von Qt Objektdateien zur Neukompilierung verteilen
- Alternativ kann man eine kommerzielle Lizenz kaufen, aber die kostet mehrere tausend Dollar
wxWidgets
- Eine leicht zu erlernende Bibliothek
- wxFormBuilder kann verwendet werden
- Hat eine freizügigere Lizenz als Qt und kann statisch in eine 3-MB-Executable gelinkt werden
- Probleme:
- Unter Windows werden native Win32-Komponenten verwendet, ohne Styling-Optionen anzubieten
- Unterstützt die Anwendung dunkler Controls wie im Windows-Datei-Explorer, aber das Ergebnis ist nicht besonders gut
hikogui
- Eine neue GUI-Bibliothek im Retained-Mode mit Vulkan als Backend
- Hat integrierten Dark Mode und lässt sich leicht stylen
- Probleme:
- Man braucht praktisch einen Doktortitel in Informatik, um sie erfolgreich zu kompilieren
- Nach über 30 Minuten Kompilationsversuchen für die Beispiele kam nur eine ausführbare Datei heraus, die sofort mit einer Zugriffsverletzung innerhalb der Vulkan-Bibliothek abstürzte
Sciter
- Eine gute Alternative zu Electron, mit der sich GUIs für Desktop-Apps mit HTML/CSS schreiben lassen
- Probleme:
- Die Größe der fertigen App von etwa 25 MB zusammen mit allen
.dll-Dateien scheint problematisch, ist aber noch akzeptabel
- Es wäre besser, wenn es Open Source wäre und man die statisch gelinkte Version auch kommerziell nutzen könnte
- Es ist nicht so teuer wie Qt ($310), daher würde man gern dafür bezahlen
- Das Problem ist, dass das Rendering nicht besonders gut ist
- Es gab Aliasing-Probleme bei Schriftarten und Bildern
- Das Fenster hat einen ziemlich dicken (2–3 px) grauen Rahmen, der sich nicht anpassen oder ändern lässt
WinForms / WPF
- Fragt man nach einer C++-GUI-Bibliothek, empfehlen die meisten stattdessen einen anderen Stack
- C++ sei keine gute Idee, daher solle man das Frontend des Programms in einem anderen Stack schreiben und die in C++ geschriebene Funktionalität als Komponente/Modul laden
- Man kann eine einzelne
.exe-Datei in kleiner Größe haben und WinForms/WPF verwenden
.dll-Dateien können als Ressourcen in die App gebündelt, in einen temporären Ordner extrahiert und dann per P/Invoke verwendet werden; außerdem kann man kompilierte .dll-Dateien innerhalb der C#/.NET-App aufrufen oder C++/CLI verwenden
- Probleme:
- Das .NET Framework ist unter Windows 10 und höher vorinstalliert und erfüllt damit technisch gesehen das Kriterium „keine Abhängigkeiten“
-
- Wenn man
.dll-Dateien bündelt, müssen sie irgendwohin extrahiert werden, und es muss zusätzlicher Code geschrieben werden, damit P/Invoke funktioniert
-
- C++/CLI wird zu .NET-IL-Code kompiliert, sodass C++-Code erscheint, der nach C# übersetzt wurde
Lösung?
- Für einfache Apps scheint nichts besser geeignet zu sein als Dear ImGui
- Beim Entwerfen komplexer UIs hat es vor allem Nachteile, und da es keine Retained-Mode-, sondern eine Immediate-Mode-UI ist, muss ein GPU-Renderer wie DirectX laufen, um die UI mit mehr als 60 Frames pro Sekunde zu rendern
- In allen anderen Punkten passt es jedoch
- Das kompilierte Programm ist nur 500 KB groß, und es muss kein VC++ Redistributable installiert werden
Meinung von GN⁺
- Wie der Autor sagt, scheint es keine perfekte Bibliothek für die Entwicklung von GUI-Apps zu geben. Je nach Anforderungen gibt es Trade-offs
- Für einfache Apps scheint Dear ImGui am besten geeignet zu sein, aber für komplexe UIs ist ein GUI-Toolkit im Retained Mode vermutlich die bessere Wahl
- Beim Erstellen kommerzieller Apps können Lizenzkosten ein wichtiger Faktor sein. Bibliotheken wie Qt sind teuer, während wxWidgets kostenlos genutzt werden kann
- Das Erstellen von GUI-Apps in C++ ist nicht einfach, daher könnte es realistischer sein, das Frontend in C# oder einer anderen Sprache zu entwickeln und nur die performancekritischen Teile in C++ zu implementieren
- Wenn man unter Windows ein natives Look-and-Feel möchte, sind WinUI oder MFC sinnvoll, bei Bedarf an plattformübergreifender Unterstützung könnten Qt oder wxWidgets jedoch die bessere Wahl sein
7 Kommentare
hikogui ist ja ein furchteinflößendes Ding, wow
https://getstream.io/blog/flutter-desktop-vs-electron/ Vergleich der Performance anhand verschiedener Kennzahlen
Im Vergleich zu Sciter und Electron ist auch Flutter Windows Desktop Build eine Überlegung wert. Es gibt zwar gelegentlich Plugins mit Bugs, aber die Basis ist solide, sodass es sich als Transportmedium nutzen lässt.
Singleton-Instanz, automatische Updates, Statusleiste, Windows-Benachrichtigungen, schnelle Startzeit, die Sprache Dart, Win32API-Plugin usw.
Delphi
C++ Builder
„Um erfolgreich zu kompilieren, braucht man einen Doktortitel in Informatik“
LOL
Hacker-News-Kommentar