*Docking/Floating ウインドウ [#pb0784a9]
#column(説明)
このTipsの完成に協力していただけるという方は、&edit{こちら};をクリックして、記事を編集してください。記事を編集できるのは基本的には「本文」の部分ですが、題名や「要約」がTipsとして適当ではない場合は、これらを書き直すこともできます。詳しくは、[[こちら>../]]をご覧ください。
#column(end)
-器の作成者:Shibaman
-投稿日:2006-08-10 (木) 10:32:30
**要約 [#t6009905]
ウィンドウの表示位置を任意にフローティングさせることが可能で、固定表示に切り替えることも可能なDocking/Floating ウインドウについて説明します。
**本文 [#j46b0300]

yukichikaと申します。
このテーマに沿って、不完全ではありますが私がドッキングウィンドウコントロールを
作成したときのtipsを記述させていただきます。

-----------
私が作成したメインコントロールは4種に分かれます。

.據璽献灰鵐謄福.NET標準のTabPageコントロールに相当します)

⊂綉,離灰鵐謄覆魍頁次Υ浜するコンテナ(.NET標準のTabControlコントロールに相当します。)以下、「ペイン」と呼びます。

‐綉△離灰鵐謄覆魍頁次Υ浜するコンテナ
 これがメインウィンドウ上に直接配置される、実質上一番上の階層のコンテナです。以下「ベイ」と呼びます。

ぞ綉△魍頁爾掘↓ 銑のコンテナとOLEドラッグアンドドロップで通信するFormクラスを継承したフォーム。以下、単に「フォーム」と呼びます。

ドッキング動作を実現するにあたり、重要なのは◆銑い力携になります。
ドッキング/フローティングだけに絞って大雑把に言えば、
ペインの親コントロールをベイやフォームに切り替えて実現する。ということになります。
しかし、ドッキング/フローティングにおける最大の問題は、
--メインウィンドウ内の複数のペインレイアウトを、どのように維持するか。
--破綻することなく、どのようにペインレイアウトの再構成を行うか。
つまり、「どうドッキングさせるの?」だと思います。


-----------
VisualStudio等で実装されている、このようなドッキングウィンドウは大抵の場合、
-ユーザが既存のドッキングされたコントロールの四隅に追加ドッキングできるように
 動作する。
ことが言えます。



ここから推測できることとしては、
^譴弔離Εンドウ(この場合はペイン)が他のウィンドウを子ノードとして
 管理すればよいではないか。

ということになります。

-----------
では、管理する子ノードの数や分岐法則は?という問題が次にあります。

A.ユーザの操作上、四隅にドッキング追加できるのだから、「任意のペインは4方向の子ノードを持つ」で良いのでは?

 残念ながら、その方法では私は上手く実装できませんでした。
ノードの階層が増えるにつれて、ルートノードが、子ノードの位置やサイズを把握できなくなるからです。
リサイズ時、ドッキング状態の再構成時に、位置や領域などの情報は必須です。

--------
結論から言うと私の場合は、
-右方向と下方向だけを子ノードとして持つ
-左や上方向にドッキング追加する場合は、「追加する」ノードを親ノードとし、その右もしくは下方向の子ノードとして「追加される」ノードが再配備される

としました。
さらに、このノード(ペイン)間の関係性にもう一つのルールを加えます。

-新たなノード(ペイン)を追加する場合は、追加されるペインの領域の一部を新たなペインの領域として分け与える。

この2つの決まりによって、ペインを配置するメインウィンドウ「ベイ」上では
次の法則が成り立つようになります。

.戰ぞ紊痢任意のペインの子ノードに関して、

--直接の右子ノードは必ず、そのペインの右に隣接するペインの中で一番上に位置するペインである。
--直接の下子ノードは必ず、そのペインの下に隣接するペインの中で一番左に位置するペインである。

△泙拭△△襯撻ぅ鵑魎霆爐箸靴織痢璽疋船Дぅ鵑遼端子ノードに関して
--直接の右子ノードの下方向の末端ノード(ペイン)は、基準とするペインの領域の
下限より下に位置することはない。
--直接の下子ノードの右方向の末端ノード(ペイン)は、基準とするペインの領域の
右限より右に位置することはない。


言葉では分かりにくいと思います。
VisualStudioのデザイナ上で、SplitContainerコントロールを連鎖的に配置して
イメージしてみてください。上記文章の意図が分かりやすくなります。

兎に角、この法則を頼りに、最初に挙げた「ベイ」は子コントロールの追加・削除・
及びレイアウトを行います。
この二つのルールにより、一番最初に挙げた
--メインウィンドウ内の複数のペインレイアウトを、どのように維持するか。
--破綻することなく、どのようにペインレイアウトの再構成を行うか。

が解決できます。

--------
残念ながら、ソースコードの雛形は、wikiに載せられる分量ではないので添付できませんが、
この文章が皆様の参考になれば幸いです。
**コメント [#k956e04b]
#comment

//これより下は変更しないでください
#pageinfo([[:Category/.NET]],2006-08-10 (木) 10:32:30,,2006-08-10 (木) 10:32:30,)
#pageinfo([[:Category/.NET]],2006-08-10 (木) 10:32:30,,2007-03-20 (火) 15:33:59,)
[ トップ ]   [ 編集 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]