9

クロスプラットフォームのテキスト エディターである Sublime Text 2 のファンとして、私はそれがどのように開発されたかについて調査を行ってきました。開発者は、Linux 用の GTK を使用した 99% の C++ であり、「Sublime GUI」と呼ばれるカスタム UI ツールキットを使用していると述べています。これは開発者からの引用です

Sublime Text 2 自体はカスタム UI ツールキットを使用しています。これが意味をなさないアプリはたくさんありますが、ツールキットに関係なく多くの UI コントロールをカスタムにする必要があることを常に知っていた Sublime Text にとっては、それほど不合理な選択ではありません (たとえば、テキスト コントロールとタブ コントロール)。UI ツールキットはクロス プラットフォームの抽象化レイヤーの上に置かれます。これは、最小公分母ではなく、プラットフォーム機能の結合です。

私の質問は、クロスプラットフォームの抽象化レイヤーのオプションは何ですか? これは、GTK、QT、SDL よりも低いレベルにあると思います。クロス プラットフォームで、コードを 1 回だけ記述する必要があるカスタム UI ツールキットを作成する方法を理解しようとしています。

UI Toolkit のメリットはありがたいのですが、Windows、Linux、Mac で自分のアプリケーションをサポートしたい場合、どこから始めればよいかわかりません。

4

2 に答える 2

5

最も重要な問題は、キーボードとマウスのイベントを描画して取得する方法だと思います。

私が見ているように、描画には2つのアプローチがあります。

  1. OpenGL コンテキストを作成し、OpenGL でウィジェットを描画します。グルイのように
  2. ネイティブの描画インフラストラクチャを使用します。Windows のGDI+ 、X11 のXLibのように。

もちろん、プラットフォームごとに特定のものを実装する必要があります。OpenGL では、各プラットフォームのコンテキスト (WGL、GLX、..) 処理を記述する必要がありますが、ネイティブの描画インフラストラクチャでは、さらに多くの作業が必要です。すべての描画インフラストラクチャは一意であるため、描画の抽象化を作成してから、描画抽象化レイヤーを使用してウィジェットを実装することをお勧めします。

イベント処理に関しては、イベント処理はプラットフォームごとに固有であるため、独自の抽象化も作成する必要があると思います。

最後に、ウィジェットを描画してイベントを取得するメイン ウィンドウを作成するための抽象化レイヤーも必要です。

OpenGL を使用する場合は、ウィンドウの作成とイベント処理を既に処理しているglutから始めることができます。

覚えておいてください、私はこのようなものを実装したことがありません。ただし、目標を達成するための作業が少ないと信じているため、おそらく OpenGL アプローチを試してみます。

于 2013-01-25T09:10:36.533 に答える
2

プラットフォーム全体で動作する多くの GUI ツールキットがあります (Tk、QT、GTK など)。

ただし、独自に作成する場合は、GTK や QT などよりも低レベルのツールキットである必要はありません。

これに似たインターフェースを公開できます

void draw_window(mywindow *mw, char *name){
    non platform specific code goes here (maybe arg parsing, etc.)

#IFDEF windows
    windows specific code goes here
#ENDIF
#IFDEF macosx
    mac specific code goes here
#ENDIF
#IFDEF linux
    linux specific code goes here
#ENDIF

    non platform specific code goes here (tidying up, recording state, etc.)
}

プラットフォーム固有の各セクション内で、そのプラットフォーム用の GUI ツールキットにディスパッチするか、使用可能なインターフェイス (つまり、Unix 用の X11) を使用できます。

コードをコンパイルするときに、ターゲット プラットフォームを指定します。これにより、コンパイルされる IFDEF セクションが決まります。

もちろん、これは過度に単純化されているため、公開するインターフェイスをネイティブの同等のものにマッピングするのが面倒にならないように細心の注意を払う必要があります。

于 2013-02-13T22:12:01.593 に答える