MDI子ウィンドウを常に最前面に表示させるには?

解決


ちょう  2005-05-27 20:04:35  No: 90106  IP: [192.*.*.*]

MDIの子フォームを複数表示させ、ある特定の子フォームだけを常に最前面に表示させるにはどうすればいいでしょうか?
また、最前面に表示させるときはモードレスで表示させたいのですが。

SDIでは、APIの "SetWindowPos()" を使ったり、"Form2.Show 0, Form1" と書くなりして簡単にできますが、Form1, Form2 共に子フォームだった場合、
どうすればいいのでしょうか?

編集 削除
。。。  2005-05-27 20:20:24  No: 90107  IP: [192.*.*.*]

その前に設計見直したほうがいいね。
それ、MDIとはいえない。

編集 削除
3−t  2005-05-27 21:10:18  No: 90108  IP: [192.*.*.*]

MDI子ウィンドウとしてでなく普通にフォームを表示し
MDI親ウィンドウから自ウィンドウが出ないように
制御してやるとか。

編集 削除
3−t  2005-05-27 21:11:48  No: 90109  IP: [192.*.*.*]

もしかして「最前面」とは、全ての子ウィンドウの最前面のこと?
それとも全てのウィンドウの最前面?

編集 削除
ちょう  2005-05-27 21:30:36  No: 90110  IP: [192.*.*.*]

全てのウィンドウではなく、子ウィンドウ同士で、ある特定の子ウィンドウだけを最前面に表示させたいのです。

要は、親ウィンドウを移動させたとき、親ウィンドウ内での位置関係を保ったままにしたいので、通常フォームではなく、あえて子フォームで作成したいのです。

編集 削除
3−t  2005-05-27 23:18:10  No: 90111  IP: [192.*.*.*]

邪道だけど、こんなのでなりました。

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は親フォームの端にかかっても親フォームにはスクロールバーが現れません。)

編集 削除
ちょう  2005-05-30 09:22:55  No: 90112  IP: [192.*.*.*]

なるほど。
先に通常フォームを最前面表示させ、あとで親ウインドウを変更させてやればいいのですね。

3−tさんありがとうございました。

編集 削除