最終更新日 :
VB Tips

ドッキングウィンドウをVBで作る

Windowsのウィンドウには、親子の関係があります。一番わかりやすい例が、MDIウィンドウとMID子ウィンドウにあります。
しかし、この親子の関係は、VBだけでは変更することはできません。VB5.0になって、ピクチャーボックスなど一部のコントロールのためにContainerプロパティが追加されましたが、フォーム間ではコンテナ関係を変更できないなど、あまり期待できるものではありません。
今回は時間があまりないため、ウィンドウの親子関係の話にとどめておきます。

構文
' GetParent()/SetParent()関数
Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

ウィンドウの親子関係
1.ウィンドウの親子関係とは?
Windowsのウィンドウには、全て親子関係があります。例えば、「メモ帳」のウィンドウもデスクトップウィンドウという「画面」の子ウィンドウです。
例えば右の絵のように、2つの独立したフォームがある時、この2つのフォームはいわゆる「兄弟」の関係にあります。親はというと、デスクトップウィンドウです。
しかし、SetParent()APIでこのフォームの親子関係を変更してやることにより、「擬似」MDIのような形になります。
2.親子関係を変えてみよう
ウィンドウの親子関係を変えるには、

Dim OldParent_hwnd As Long

OldParent_hwnd = SetParent(Form2.hwnd, Form1.hwnd)


とします。Form2が変更対象ウィンドウで、Form1が新しい親ウィンドウです。戻り値は、変更前の親ウィンドウのウィンドウハンドルです。
右の図では、"Form1.hwnd"の代わりに"Picture1.hwnd"としています。これでForm2の親ウィンドウはピクチャーボックスです。
3.親子関係を変えたらどうなる?
VBのフォームなどで親子関係を変えた場合でも、イベントを受け取るフォームは変わりません。しかし、注意することは座標系が変わっても位置の値が変わらないことです。つまり親ウィンドウを変更する前の位置によっては、思わぬところにコントロールが表示されます。
また、フォームの親子関係を変えた場合、アンロード処理の時注意してください。子ウィンドウをアンロードし忘れると、一般保護エラーが起きる可能性があります。
4.親子関係を変えられるのはフォームだけ?
冒頭にちょっと書いていますが、何も親子関係を変えられるのはフォームだけとは限りません。ウィンドウハンドルを持つコントロール(だから、Labelなどのウィンドウレスコントロールではできないんだ...)なら何でもできます。
例えば、ComboBoxの親をデスクトップウィンドウにして、フォームの外に無理矢理表示する、なんていうこともできます。(もともと、ComboBoxのドロップダウンリスト部分の親ウィンドウはデスクトップウィンドウです。)

(次回) ドッキングウィンドウを作ってみよう

Copyright (C) 1999 Satoshi Tadaフィードバックはこちら
Home