0

シンプルなGUIを設計しています。私は子と 1 つの親を持つウィジェットを持っています。各 Widget は、WidgetComposite オブジェクトのベクトルを持つ Composite オブジェクトです。これらの WidgetComposites の 1 つは PaintingBehaviour ですが、Widget はそれ自体を認識していません。

ウィンドウを表示するには、ScreenVisitor と呼ばれるビジターを使用します。Visitor が呼び出されると、次のようになります。

最初のウィジェットである WidgetScene は、各ウィジェットで反復処理を行い、「accept(Visitor* v)」メソッドを呼び出します。次に、各ウィジェットが訪問者を受け入れ、その子に対して繰り返し処理を行います。

たとえば、これは訪問者が受け入れなければならないオブジェクトのリストです (発生する順序で)。

root
    child1
       child2
         child3
       child4
    child5
       child6
    child7

今、私の問題は簡単です: 各ウィジェットをその親にペイントしたいのです。どのように進めますか?ツリーで試してみましたが、常に同じ問題があります。階層を上に移動する必要がある場合 (たとえば、child3 を表示した後、child4 を表示する必要がある場合)、取得方法がわかりません。右の親。

私は C++ でコーディングしていますが、この問題は言語固有ではありません。

あなたはなにか考えはありますか ?前もって感謝します !

4

2 に答える 2

0

わかりました、他に何も見つからなかったので、この解決策を試しました:

ビジターは「DisplayNodes」オブジェクトのツリーを作成します。これらのオブジェクトは、基本的にポインターで構成されるクラスです。クラスの属性は次のとおりです。

class DisplayNode
{
   private:
     Widget* myWidget;
     PaintingBehaviour* myPB;
     DisplayNode* myParent;
     vector <DisplayNode*>myChildren;
};

すべての DisplayNode は、ビジターのベクターにストックされています。

次に、PaintingBehaviour ごとに、接続されている Widget の親をテストし、Node の「myWidget」の 1 つがこの親であるかどうかを確認します。だから私はすべてがどこにあるかを見つけることができます。その後は、非常に簡単です。シーンの最初の DisplayNode で呼び出される、子への再帰呼び出しを伴う DisplayNode の単純なペイント メソッドです...

ちょっと重いので、DisplayNodeのツリーは1回だけ作成します(ただし、PaintingBehaviourやWidgetの追加・削除があればやり直します)。ツリーが既に存在する場合は、再帰的な描画に直接移動します。

少しねじれています (そしておそらく完全には最適化されていません)、認めますが、うまくいきます! しかし、誰かがより良い解決策を持っているなら、私はそれを聞いてうれしいです.

于 2010-10-12T17:28:57.413 に答える
0

質問は私にはあまり明確ではありません。正しい順序でペイントする必要がある場合。子の前に親、それは非常に簡単です:

accept(Visitor v)
  paint() //paint parent first
  v.visit()
  foreach child
    child.accept(v) //then paint children

親が必要な場合 (なぜ?)、accept メソッドを (オプションで) 親ノードを取るように変更できます。

accept(Visitor v,Element parent = null)
  paint()
  v.visit()
  parent.foo()
  foreach child
    child.accept(v,this)
于 2010-10-11T10:43:26.367 に答える