|
■No92289 (むん さん) に返信 > ウインドウを最小化するとどこかに MinimizeBox と MaximizeBox を False にして運用していただくのが手っ取り早いのですけれどね…。
> 消えてしまってプログラムを再起動しないとアクセスできなくなってしまうのですが・・・
消えたというか、MdiClient コントロールの背面に居る状態なのでしょう。 先の No92276 のコントロール階層は、下記の構成になっています。
Form(Form1) ├MdiClient(IsMdiContainer による自動生成) │├Form(Child1) │└Form(Child2) └Form(Child3)
MdiClient コントロールというのは、MDI 親フォームのクライアント領域に自動配置される灰色のパネルです。
MdiClient は通常、Dock プロパティが Fill の状態であるため、 Form1 のクライアント領域全てを覆っている状態となります。
今回の場合、MdiClient も Child3 も、Form1 の子コントロールとなっているため、 重なり合っている場合は、より手前にある方が見えた状態となります。
★案1:最小化された瞬間、MDIClient を最背面に移動しなおす。
Partial Public Class Form1 Private Child1, Child2, Child3 As Form
Public Sub New() InitializeComponent()
IsMdiContainer = True Child1 = New Form() With {.MdiParent = Me, .Text = "Child1"} Child2 = New Form() With {.MdiParent = Me, .Text = "Child2"}
Child3 = New Form() With {.TopLevel = False, .Text = "TopMost"} AddHandler Child3.SizeChanged, AddressOf TopMostChildWindowStateChanged Controls.Add(Child3)
Child1.Show() Child2.Show() Child3.Show() End Sub
Private Sub TopMostChildWindowStateChanged(sender As Object, e As EventArgs) Static IsBusy As Boolean = False If Not IsBusy Then IsBusy = True If DirectCast(sender, Form).WindowState = FormWindowState.Minimized Then Me.Controls.OfType(Of MdiClient)().FirstOrDefault()?.SendToBack() End If IsBusy = False End If End Sub End Class
欠点: Child3 は「MDI 子フォーム」では無く「子コントロール」であるため、Chlld1/Child2 を最小化したときに アイコンが重なってしまう。また、最大化時の振る舞いが通常の MDI 子フォームとは異なる。
★案2:通常時は「子コントロール」、最小化時は「MDI 子フォーム」として振舞うようにする。
Partial Public Class Form1 Private Child1, Child2, Child3 As Form
Public Sub New() InitializeComponent()
IsMdiContainer = True Child1 = New Form() With {.MdiParent = Me, .Text = "Child1"} Child2 = New Form() With {.MdiParent = Me, .Text = "Child2"}
Child3 = New Form() With {.TopLevel = False, .Text = "TopMost"} AddHandler Child3.SizeChanged, AddressOf TopMostChildWindowStateChanged Controls.Add(Child3)
Child1.Show() Child2.Show() Child3.Show() End Sub
Private Sub TopMostChildWindowStateChanged(sender As Object, e As EventArgs) Static IsBusy As Boolean = False If Not IsBusy Then IsBusy = True Dim f = DirectCast(sender, Form)
'If f.WindowState <> FormWindowState.Minimized Then If f.WindowState = FormWindowState.Normal Then If f.MdiParent IsNot Nothing Then f.MdiParent = Nothing f.TopLevel = False f.Parent = Me End If Else f.Visible = False f.MdiParent = Me f.Visible = True End If IsBusy = False End If End Sub End Class
欠点: 「子コントロール」と「MDI 子フォーム」の間で切り替えるたびに、ウィンドウハンドルが再生成される。 また、最大化」時の連携が不完全。
|