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

[戻る]
ATTU 2005/07/15(金) 00:40:35
MDI子フォームを最前面に表示させたいのですが何か方法がありましたら 
教えてください! 

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

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

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

ねろ 2005/07/15(金) 10:07:15
ウーン、仕様なのかバグなのか。。。。 
試しに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. [E-Mail] 2005/07/15(金) 10:20:07
MDI子Formは、子Windowであって、TopLevelWindowではないのですから、 
SetWindowPosは最前面や最背面設定を受け入れません。 

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

ATTU 2005/07/15(金) 12:08:15
[[解決]]
子フォーム.TopMost = True は出来ないとの事で解決とさせいてだきます。 

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

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

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

ねろ 2005/07/15(金) 13:46:49
>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にはならないけど。 

スポンサーリンク

追加発言(4ヶ月以上古い記事に書き込めません。)
■ お名前(ペンネーム可)
  
■ メールアドレス(省略可、半角で入力)
  
■ ホームページアドレス(省略可、半角で入力)
  
■ 発言(エラー時再送信禁止)
  ←解決時は質問者本人がここをチェックしてください。
  
■ 書き込み認証キーを入力して下さい(下記のキーを指定して下さい)
  認証キー :   
  認証キー(確認入力用) :   
■ あなたのランクを選択して下さい(省略可)
   なし   初心者    中級者    上級者    常連    IP表示

  

Programming Library