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

解決


ちょう  2005-05-28 05:04:35  No: 90106

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

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


。。。  2005-05-28 05:20:24  No: 90107

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


3−t  2005-05-28 06:10:18  No: 90108

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


3−t  2005-05-28 06:11:48  No: 90109

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


ちょう  2005-05-28 06:30:36  No: 90110

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

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


3−t  2005-05-28 08:18:10  No: 90111

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

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 18:22:55  No: 90112

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加