MDIの子フォームを複数表示させ、ある特定の子フォームだけを常に最前面に表示させるにはどうすればいいでしょうか?
また、最前面に表示させるときはモードレスで表示させたいのですが。
SDIでは、APIの "SetWindowPos()" を使ったり、"Form2.Show 0, Form1" と書くなりして簡単にできますが、Form1, Form2 共に子フォームだった場合、
どうすればいいのでしょうか?
その前に設計見直したほうがいいね。
それ、MDIとはいえない。
MDI子ウィンドウとしてでなく普通にフォームを表示し
MDI親ウィンドウから自ウィンドウが出ないように
制御してやるとか。
もしかして「最前面」とは、全ての子ウィンドウの最前面のこと?
それとも全てのウィンドウの最前面?
全てのウィンドウではなく、子ウィンドウ同士で、ある特定の子ウィンドウだけを最前面に表示させたいのです。
要は、親ウィンドウを移動させたとき、親ウィンドウ内での位置関係を保ったままにしたいので、通常フォームではなく、あえて子フォームで作成したいのです。
邪道だけど、こんなのでなりました。
1)親フォーム(MDIForm1),通常のフォーム(Form1),子フォーム(Form2,Form3)を用意して下さい
2)Form1のMDIChildプロパティはFalse,Form2,Form3のMDIChildプロパティはTrueに設定します。
3)MDIForm1に以下のコードを書きます
Private Sub MDIForm_Load()
Form1.Show
Form2.Show
Form3.Show
SetWindowPos Form1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
SetParent Form1.hwnd, MDIForm1.hwnd
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
SetParent Form1.hwnd, 0&
Unload Form1
End Sub
これでForm1はディアクティブになってもForm2,Form3の前にいますよ。
こんな使い方で良いのかは検証していませんので責任は持てません。
(Form1は親フォームの端にかかっても親フォームにはスクロールバーが現れません。)
なるほど。
先に通常フォームを最前面表示させ、あとで親ウインドウを変更させてやればいいのですね。
3−tさんありがとうございました。
ツイート | ![]() |