MDI子フォームを最前面にするには?

解決


ATTU  2005-07-15 09:40:35  No: 123506

MDI子フォームを最前面に表示させたいのですが何か方法がありましたら
教えてください!

子フォーム.TopMost = True としても必ずアクティブなフォームが
最前面になってしまいます!

何かほかの設定などがあるのでしょうか?

環境は OS:Win2003 VB:.net2003です
よろしくお願いします。


ねろ  2005-07-15 19:07:15  No: 123507

ウーン、仕様なのかバグなのか。。。。
試しにAPIを使って、f2をTopMostに設定しようとしたが、だめだった。(^^;
Public Class Form1
    Inherits System.Windows.Forms.Form
    Declare Function SetWindowPos Lib "user32" _
        (ByVal hWnd As IntPtr, ByVal hWndInsertAfter As Integer, _
        ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, _
        ByVal cy As Integer, ByVal wFlags As Integer) As Integer
    Private Const SWP_NOSIZE As Long = &H1        ' サイズを変更しない
    Private Const SWP_NOMOVE As Long = &H2        ' 位置を変更しない

    Dim f2 As New Form2
    Dim f3 As New Form3
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        f2.MdiParent = Me
        f3.MdiParent = Me
        f2.Show()
        f3.Show()
        SetWindowPos(f2.Handle, -1, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
    End Sub
End Class
2番目の引数に0を入れると、その時はトップに表示されるのでコードは正しいと思われるのだが。。。。

タイマーを使ってf2.Activate()などとするか、他のフォームがアクティブになったら、
f2.Activate()を実行するか、そんな手しか。。。。orz


K.J.K.  2005-07-15 19:20:07  No: 123508

MDI子Formは、子Windowであって、TopLevelWindowではないのですから、
SetWindowPosは最前面や最背面設定を受け入れません。

最前面表示をするのであれば、Owned Windowとして実装すべきであって、
Child Windowをここで用いるのは不適切ですよね。


ATTU  2005-07-15 21:08:15  No: 123509

子フォーム.TopMost = True は出来ないとの事で解決とさせいてだきます。

ねろさん
 API関数まで載せていただきありがとうございました!

K.J.K.さん
 子フォームとしてではなく表示する方法を考えます!

ありがとうございました。


ねろ  2005-07-15 22:46:49  No: 123510

>MDI子Formは、子Windowであって、TopLevelWindowではないのですから、
>SetWindowPosは最前面や最背面設定を受け入れません。
常識的に考えればTopMostの言葉からしてそうなんでしょうね。

ただしMSDNのSetWindowPosの説明のなかで「HWND_TOPMOST」の説明は
>ウィンドウを最前面ウィンドウではないすべてのウィンドウの前に挿入します。
>このウィンドウは、アクティブでないときにも最前面に表示されます。
英語では
>Places the window above all non-topmost windows. 
>The window maintains its topmost position even when it is deactivated.
となってます。

Dim r As Boolean
r = SetWindowPos(f2.Handle, -1, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
とやると関数は一応成功するんで困っちゃうな、TopMostにはならないけど。


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

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






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