- 題名: 画面の最前面にメッセージを表示させる方法
- 日時: 2005/03/03 21:00:18
- ID: 9544
- この記事の返信元: - (なし)
 
- この記事への返信: - [9546] Re[1]: 画面の最前面にメッセージを表示させる方法2005/03/03 21:28:01
 
- ツリーを表示
おはようございます、じゃんぬねっと です。
■No9554に返信(平ちゃんさんの記事)
案その 1 (下策)
オーナーのオーナーを利用する。
1 方のフォームが閉じる時、開く時にオーナーをすり替える方法。
サブフォームが、単一であるのならば、そこそこ使えますが難点が多々あります。
フォームが増えると似たような実装が必要となる。
フォームの型を毎回判断せねばならないため、拡張性には長けていない。
FormMain:------------------------------------------------
Friend Class FormMain
    Inherits System.Windows.Forms.Form
' _______________________
'| Windows フォーム デザイナで生成されたコード |
'  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    '/ プライベート メンバ
    Private hFormSub  As FormSub
    Private hFormHelp As FormHelp
    '/ サブ フォームを開く
    Private Sub Button1_Click(...) Handles Button1.Click
        hFormSub = New FormSub()
        Me.AddOwnedForm(hFormSub)
        hFormSub.Show()
    End Sub
    '/ ヘルプ フォームを開く
    Private Sub Button2_Click(...) Handles Button2.Click
        hFormHelp = New FormHelp()
        If hFormSub Is Nothing OrElse hFormSub.IsDisposed Then
            Me.AddOwnedForm(hFormHelp)
        Else
            hFormSub.AddOwnedForm(hFormHelp)
        End if
        hFormHelp.Show()
    End Sub
    '/ メッセージ ボックスの表示
    Private Sub Button3_Click(...) Handles Button3.Click
        MessageBox.Show("メッセージ ボックスですが、何か?")
    End Sub
End Class
FormSub:-------------------------------------------------
Friend Class FormSub
    Inherits System.Windows.Forms.Form
' _______________________
'| Windows フォーム デザイナで生成されたコード |
'  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    '/ Load 時に FormHelp の存在している場合は所有をすり替え
    Private Sub FormSub_Load(...) Handles MyBase.Load
        If TypeOf Me.Owner Is FormMain Then
            For Each hForm As Form In Me.Owner.OwnedForms
                If TypeOf hForm Is FormHelp Then
                    Me.AddOwnedForm(hForm)
                End If
            Next hForm
        End If
    End Sub
    '/ Close 時に HelpForm が存在している場合は所有をすり替え
    Private Sub FormSub_Closed(...) Handles MyBase.Closed
        For Each hForm As Form In Me.OwnedForms
            If TypeOf hForm Is FormHelp Then
                If TypeOf Me.Owner Is FormMain Then
                    Dim hOwnerForm As Form = Me.Owner
                    Me.Owner = Nothing
                    hForm.Owner = hOwnerForm
                End If
            End If
        Next hForm
    End Sub
End Class
分類:[.NET]
こんにちは 平ちゃんです。
いつも有難うございます。すみませんがまたアドバイスをお願いします。
画面の最前面にメッセージを表示させる方法です。
現状はメッセージボックスでユーザーに注意を促しています。
この場合、メッセージボックスが最前面に表示されなければ、操作不可能になり色々と面倒です。
アプリのイメージとして
@ 起動すると基本フォームを表示
A 基本フォームからユーザが必要ならヘルプ画面を表示できる。ヘルプ画面は常に最前面 (TopMost = True) 表示。
(ヘルプ画面を見ながら実際の操作が出来るように作っています)
B 基本フォームから別の操作フォームを新たに起動する。基本フォームのボタンを操作する必要があるので、モーダレスとし、
基本フォームに所有させて、基本フォームの前面に重ねて表示します。
C ヘルプ画面が表示されている場合に操作フォームを起動してもヘルプ画面は最前面表示。
このような場合に入力ミスなどでメッセージボックスを表示した場合、ヘルプ画面の背後になると、操作不可能となります。
これを防ぐためにメッセージボックスを
MessageBox.Show メソッド (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions)
で MessageBoxOptions = DefaultDesktopOnly で使っています。
ところがテストしてみると
xp, 2000 では問題ないのですが、98 の場合 ヘルプ画面の背後になり不具合です。
そこで教えて頂きたいのは
ヘルプ画面、メッセージボックスをどの様にしたらよいかという案です。
私が考えている案は、メッセージボックスをメッセージ用のフォーム(TopMost = True)に置き換えるという方法です。
MessageBox.Show メソッド (IWin32Window, String) でもいいのですが、常にIWin32Window を管理する必要があり面倒です。
(なおタスクバーには操作フォームは表示しないようにしています)