- C++でGUI作成用ライブラリを調べて比較した結果のまとめ
- 基本要件: Windows対応のみでよく、商用利用可能、ダークモードを含む簡単なスタイリング、依存関係を最小限にした40MB未満の単一EXE生成、迅速な開発
WinUI 3
- 最初は素晴らしい選択肢に見える
- モダンなWindowsコンポーネントを使え、スタイルカラーをカスタマイズできる
- XAMLでデザインでき、Visual Studioデザイナーをそのまま使うこともできる
- 問題:
- 非パッケージ形式でアプリを配布することがあまりうまくサポートされていない
- アプリをVMや別のコンピューターに移すと、たいてい実行に失敗する
- WinUI機能を処理する多数の
.dllファイルを同梱する必要がある
- 単一のポータブル
.exeファイルを作れない
- パッケージ形式で使うぶんには問題ないが、AppXパッケージとしてインストールされるためWin32 APIへのアクセスで問題が生じる
Win32 / MFC / Win32をラップする小さなライブラリ
- 高い移植性が必要なので、OSのネイティブレンダリングを使うのは理にかなっている
- プログラムは単一の
.exeファイルにでき、サイズも非常に小さくできる(MFCを静的リンクした場合)
- 誰かがすでに書いた、よりミニマルなライブラリを使うこともできる
- 問題:
- 標準のWin32コントロールをスタイリングするのは非常に難しい
- すべてのコントロールについてカスタム描画機能を書かなければならない
- Windowsエクスプローラーで使われている「隠し」ダークモードはあるが、一部のコントロールにしか適用されず、見た目もまだいまひとつ
Qt
- C++ GUIの聖杯
- 複雑ではあるが、Qt Style Sheetsを使えば簡単にスタイル指定できる
- 問題:
- 動的リンクではアプリ実行に必要な
.dllが大量にあり、サイズは40MBを超える
- Qtをプログラムに静的リンクすることもできるが、オープンソース化するか、QtのLGPLライセンスのため再コンパイル用のオブジェクトファイルを配布しなければならない
- あるいは商用ライセンスを購入できるが、数千ドルかかる
wxWidgets
- 学びやすいライブラリ
- wxFormBuilderを使える
- Qtより緩やかなライセンスで、3MBの実行ファイルに静的リンクできる
- 問題:
- Windowsでは標準のWin32コンポーネントを使うため、スタイリングの選択肢がない
- Windowsエクスプローラーのダークコントロール適用には対応しているが、あまり良くない
hikogui
- Vulkanをバックエンドに使う新しいretained mode GUIライブラリ
- ダークモードを内蔵し、スタイル指定も簡単
- 問題:
- 正しくコンパイルするにはコンピューターサイエンスの博士号が必要
- 30分以上サンプルのコンパイルを試みた末に、Vulkanライブラリ内部でアクセス違反を起こして即座にクラッシュする実行ファイルしか得られなかった
Sciter
- HTML/CSSを使ってデスクトップアプリ用GUIを書ける、Electronの良い代替
- 問題:
- 最終的なアプリがすべての
.dll込みで約25MBになる点は問題になりそうだが、許容範囲ではある
- オープンソースで、商用でも静的リンク版を使えるならさらに良い
- Qtほど高価ではないので($310)、お金を払っても満足できそう
- 問題はレンダリングがあまり良くないこと
- フォントや画像のエイリアシング問題があった
- ウィンドウには、カスタマイズも修正もできない、かなり太い(2〜3px)のグレーの枠がある
WinForms / WPF
- C++ GUIライブラリについて尋ねると、たいていは別のスタックを使うよう勧められる
- C++は悪い考えなので、プログラムのフロントエンドは別のスタックで書き、C++で書いた機能をコンポーネント/モジュールとして読み込めと言われる
- 小さなサイズの単一
.exeファイルにでき、WinForms/WPFを使える
.dllをアプリのリソースとして束ねて一時フォルダーに展開させ、そのうえでP/Invokeを使い、C#/.NETアプリ内からコンパイル済みの.dllを呼び出すか、C++/CLIを使えばよい
- 問題:
- .NET FrameworkはWindows 10以降にプリインストールされているため、技術的には依存関係なしという基準を満たしている
-
.dllを束ねるとどこかに展開する必要があり、P/Invokeを機能させるために追加コードを書かなければならない
-
- C++/CLIは.NET ILコードにコンパイルされるため、C#に翻訳されたようなC++コードが見える
解決策?
- シンプルなアプリなら、Dear ImGuiより適したものはないと思う
- 複雑なUIを設計する際には主に欠点があり、retained mode UIではなくimmediate mode UIなので、UIのために毎秒60フレーム以上を描画するDirectXのようなGPUレンダラーを動かす必要がある
- しかし、それ以外のあらゆる点では条件に合っている
- コンパイル後のプログラムはわずか500KBで、VC++再頒布可能パッケージをインストールする必要もない
GN⁺の意見
- 筆者の言うとおり、GUIアプリ開発のための完璧なライブラリはないように思える。要件次第でtrade-offがある
- シンプルなアプリならDear ImGuiが最も適していそうだが、複雑なUIを作るならretained mode GUIツールキットを使うほうがよいだろう
- 商用アプリを作るなら、ライセンス費用は重要な検討事項になりうる。Qtのようなライブラリは高価だが、wxWidgetsは無料で使える
- C++でGUIアプリを作るのは簡単ではないので、C#や他の言語でフロントエンドを開発し、性能集約的な部分だけをC++で実装するほうが現実的かもしれない
- Windowsでネイティブなlook-and-feelを求めるならWinUIやMFCがよいが、クロスプラットフォーム対応が必要ならQtやwxWidgetsのほうがより良い選択肢になりうる
7件のコメント
hikogui、恐ろしい存在ですね…。
https://getstream.io/blog/flutter-desktop-vs-electron/ さまざまな指標で性能を比較
Sciter や Electron と比較するなら、Flutter Windows Desktop Build も検討に値します。ときどきバグのあるプラグインもありますが、基本はしっかりしているので、配布媒体として活用する用途であれば可能です。
シングルトンインスタンス、自動アップデート、ステータスバー、Windows 通知、速い起動時間、Dart 言語、Win32API Plugin などなど
Delphi
C++ Builder
「コンパイルを成功させるにはコンピュータサイエンスの博士号が必要」
www
Hacker Newsの意見