8 ポイント 投稿者 GN⁺ 2024-07-01 | 7件のコメント | WhatsAppで共有
  • 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件のコメント

 
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 も検討に値します。ときどきバグのあるプラグインもありますが、基本はしっかりしているので、配布媒体として活用する用途であれば可能です。
シングルトンインスタンス、自動アップデート、ステータスバー、Windows 通知、速い起動時間、Dart 言語、Win32API Plugin などなど

 
soone 2024-07-03

Delphi

 
soone 2024-07-03

C++ Builder

 
joyfui 2024-07-02

「コンパイルを成功させるにはコンピュータサイエンスの博士号が必要」
www

 
GN⁺ 2024-07-01
Hacker Newsの意見
  • 多くのコメントを読んで、前提全体が間違っていることに気づいた。ブログ記事の題名は「要件が非現実的なとき、Windows向けGUIアプリの作成はつらい」に変えるのがよさそう
  • WinFormsを対象に、.NET Framework 3.5 を使うのがよい。最新のWindowsにはすべてインストールされている
  • この記事は複数の選択肢のよい概要を提供しているが、著者の特定の要件によって多くの選択肢が排除されている
    • 完全にカスタムなGUIスタイリングを望みつつ、自前のレンダリング関数は書きたくないという要件は、簡単にカスタマイズできるGUIライブラリを選ぶ問題になる
    • 単一の自己完結型実行ファイルと40MB以下というサイズ制限の要件も、多くの選択肢を排除する。Qtはこれらの要件を満たせたかもしれないが、オープンソースライセンスが目標に合わず、ライセンスを購入したくなかった
    • 依存関係を許容する、より大きなダウンロードサイズを許容する、あるいはWindows内蔵のGUIコントロールを使うなら、状況はかなり異なる
    • 外部依存なしで軽量な完全カスタムGUIを書き、緩やかなライセンスを望むなら、ImGuiが答えになるだろうと予想していた
  • WinForms/WPFの案に大きな欠陥はないと指摘しているが、2つのスタックを要求すること以外は言及していない。ネイティブコードを望み、C#を見たくないようだが、その理由を説明していない。リバースエンジニアリングへの恐れかもしれない。UIコードに秘密が含まれることはめったにない
    • 単一exeでの配布は便利なこともあるが、このシナリオでは面倒かもしれない。Velopack(Squirrel)のようなパッケージャを使えば、単一exeとして配布でき、自動更新機能も追加できる。インストール時にディスク上へ2つ以上のファイルが置かれるのは、よい妥協点だ
    • Windowsは、他のすべてのプラットフォームを除けば、デスクトップアプリ開発において最悪のプラットフォームだ
  • LGPLライセンスのソフトウェアライブラリに対して商用ライセンス費用を払わなければならないと非難する開発者について、非常に低い評価しか持てない。彼らは自分の仕事に対して報酬を受けることを期待しており、その保証のためにクローズドソースソフトウェアを作っている。しかし、UIライブラリ作成の本当に難しい部分を解決した開発者は、世界にコードを無償で贈るべき成熟した人間であるべきだ、というわけではない
  • Sciter と「アンチエイリアシング」の問題について……著者はアプリケーションで高DPIサポートを有効にしていなかった
    • Visual Studioで有効にするか、適切なマニフェストを含めれば解決できる
    • 「Hello C++」チュートリアルで説明されている
  • より正確には:
    • 「ポータブル」(自己解凍なしの単一exe)
    • 商用利用で、コンパイル済みオブジェクトファイルを再配布したくない(これは「ポータブル」要件と合わせるとLGPLを許容しない)
    • ダークモード
    • Windows GUIアプリはつらい。これらの要件のどれか1つでも外せば、よい選択肢はたくさんある
    • ほとんどの「ポータブル」アプリケーションは win32 を使う。通常、ポータブルは小さく単純なアプリケーションであり、機能のほうがダークモードやその他のスタイリング能力より重要だ
  • 他人のオープンソースに多くを求める一方で、著者は自分の解決策をオープンソースとして公開しようとしていない
  • 私はその要件に合うGUIツールキットを開発中だ: Slint - https://slint.dev
    • 単一の .exe に静的コンパイルでき、サイズは40MB未満にできる。デスクトップで無料利用できるライセンスがある。ダーク/ライトスタイルを提供する。(開発中の)ドラッグ&ドロップ対応のWYSIWYGエディタも含まれる
  • すべてのコントロールに対してカスタムのペイント関数を書かなければならないというのは、古い win32 の哲学が著者に合っていないことを示している。win32の中核要素は wndproc だ。大半のコントロールは親に色を問い合わせる
    • それが不便なら、小さなライブラリでラップしてボイラープレートを取り除くのは大きな問題ではない
  • 結果は依存関係がない、あるいは最小限の依存関係しかない単一の .exe ファイルで、サイズは40MB未満であるべきだ
    • コンピュータには今やモダンなブラウザがある。.exe ファイルの代わりに、画像/css/javascript をインライン化した単一の .html ファイルを使うこともできる