2013-01-20 5 views
7

クロスプラットフォームのテキストエディタのSublime Text 2のファンとして、私はそれがどのように開発されたかについていくつかの研究を行ってきました。開発者は、Linux用のGTKでは99%C++であり、 "Sublime GUI"と呼ばれるカスタムUI Toolkitを使用していることに気づいています。これはデベロッパーからの引用ですC++カスタムUI Toolkit - クロスプラットフォーム抽象化層のオプション

崇高なテキスト2自体がカスタムUIツールキットを使用しています。これは意味をなさないかもしれない多くのアプリがありますが、UIコントロールの多くがツールキットに関係なくカスタムでなければならないことがいつも分かっていたサブライムテキストにとっては、それほど不合理な選択ではありません(例えば、テキストコントロールとタブコントロール)。 UIツールキットは、クロスプラットフォーム抽象レイヤの上に位置します。これは、共通の分母ではなくプラットフォームの機能の集合体です。

私の質問は、クロスプラットフォームの抽象化レイヤーにはいくつかの選択肢がありますか?私はこれがGTK、QT、SDLよりも低いレベルだと考えています。私は、クロスプラットフォームでありコードを一度書くだけのカスタムUIツールキットを作成する方法を理解しようとしています。

私はUI Toolkitのメリットを高く評価していますが、手を汚してWindows、Linux、Macで自分のアプリケーションをサポートしたいと思ったら、どこから始めたらよいか分かりません。

答えて

4

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

  1. は、OpenGLコンテキストを作成およびOpenGLを使用してウィジェットを描く:私はそれを見たよう

    は、描画のための2つのアプローチがあります。 gluiのように。

  2. ネイティブ描画インフラストラクチャを使用します。ウィンドウでGDI+と同じように、X11のXLib

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

イベントハンドリングに関しては、イベントハンドリングが各プラットフォームで一意であるため、独自の抽象化も作成する必要があります。

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

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

私はこのようなことは一度も実装していません。しかし、私はおそらくOpenGLアプローチを試みるでしょう。なぜなら、それは目標に到達する仕事が少ないからだと思います。

+0

私が見ていることに基づいて、おそらくGDIとXLibを使用しています。 Frapsのようなものを使用すると、gpuが使用されていてもデバッグ情報が表示されますが、デバッグ情報は表示されません。だから私はソフトウェアレンダリングをしていると信じています。また、gDEbuggerを実行すると、0のOpenGL呼び出しがあります。私はWindows上でしかテストしていませんが、他のプラットフォームでOpenGLを使用する可能性はありますが、疑問はあります。 – leetNightshade

1

(少数を示すためにTkの、QTとGTK)プラットフォーム間で動作多くのGUIツールキットがあります

あなたががあなた自身を書きたい場合は、GTKよりも低いレベルのツールキットである必要はありません、QTまたはそれに類するもの。あなたが利用できるものは何でもインターフェイスそのプラットフォームまたは使用のためのGUIツールキットへの発送ができ、プラットフォーム固有のセクションのそれぞれにおいて、この

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.) 
} 

に似たインターフェースさらされる可能性

(すなわち、Unix用X11) 。あなたがターゲットプラットフォームを指定し、これはIFDEF部分がでコンパイルされた決定するコードをコンパイル

もちろん、これは非常に簡易で、インターフェイスはあなたが公開するように細心の注意を取らなければなりませんネイティブの等価物にマップするのは苦痛ではありません。

+0

は、コンポーネントの作成が少ない基本ウィンドウについて説明するチュートリアルです。ちょうどアイデアを得るために。 – programmer

+0

コードに#ifdefsを付けることは維持しにくいので、決して良い考えではありません。ここで使用される描画の抽象化を持つ方がはるかに良いでしょう。もちろん、この抽象化は依然としてOSに依存しますが、ライブラリ内の小さくて専用の部分には最小限に抑えられます。それはbtwです。まさにQtのことです。プラットフォームに依存する部分を見ると、Qtの98%以上がプラットフォームに依存しないことに気付くでしょう。 Qtを使うだけで正しい選択です。 – dhaumann