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のドロップダウンリスト部分の親ウィンドウはデスクトップウィンドウです。) |