MDI子フォームを最前面に表示させたいのですが何か方法がありましたら
教えてください!
子フォーム.TopMost = True としても必ずアクティブなフォームが
最前面になってしまいます!
何かほかの設定などがあるのでしょうか?
環境は OS:Win2003 VB:.net2003です
よろしくお願いします。
ウーン、仕様なのかバグなのか。。。。
試しに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
MDI子Formは、子Windowであって、TopLevelWindowではないのですから、
SetWindowPosは最前面や最背面設定を受け入れません。
最前面表示をするのであれば、Owned Windowとして実装すべきであって、
Child Windowをここで用いるのは不適切ですよね。
子フォーム.TopMost = True は出来ないとの事で解決とさせいてだきます。
ねろさん
API関数まで載せていただきありがとうございました!
K.J.K.さん
子フォームとしてではなく表示する方法を考えます!
ありがとうございました。
>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にはならないけど。
ツイート | ![]() |