| 2020/03/25(Wed) 15:29:25 編集(投稿者)
■No94215 (はる さん) に返信 >> MDI 子フォームの場合(MdiParent が設定されている)は無理ですね。 > 親フォーム(Form1)に、MenuStripコントロールを使ってメニューも作ってますので、これに当たるかと思います。
新規プロジェクトで、下記を試してみてください。
Public Class Form1 Private FormA As Form Private FormB As Form Private FormC As Form Private FormD As Form Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click FormA = New Form() With {.Text = "A", .IsMdiContainer = True} FormB = New Form() With {.Text = "B", .MdiParent = FormA} FormC = New Form() With {.Text = "C", .TopLevel = False, .Parent = Me} FormD = New Form() With {.Text = "D"}
'A や D は、Me の子フォームとして扱われます。 'B や C は、子コントロールとして扱われます。 FormA.Show(Me) FormB.Show() FormC.Show() FormD.Show(Me) End Sub End Class
'(A) .IsMdiContainer が True であるフォーム '(B) .MdiParent が Nothing 以外であるフォーム '(C) .TopLevel が False であるフォーム '(D) 上記いずれでも無いフォーム
A は MDI 親フォームと呼ばれることがあります。 B は MDI 子フォームと呼ばれることがあります。 D は SDI フォームと呼ばれることがあります。
A や D はトップレベルウィンドウ(.TopLevel = True)であるため、 親フォームにも子フォームにもなれます。
B や C はトップレベルウィンドウでは無い(.TopLevel = False)ため、 Label や ListBox などのような「コントロール」として振る舞います。 コントロールなので、他のウィンドウの上に載せないと表示できません。
たとえば FormC は、.Parent = Me としていますので、 Form1 の子コントロールとして振る舞っていますが、 .Parent = Button1 とすれば、Button1 の子コントロールになりますし .Parent = Panel1 とすれば、Panel1 の子コントロールになります。
なお、.TopLevel = True なフォームの .Parent は常に Nothing です。 また、.MdiParent が Noting 以外なフォームの .Parent は常に MDIClient です。
> 対策としてはRadioButtonなどにすべきなのでしょうか?
MenuStrip や RadioButton などは、あまり関係ないと思います。
何故、「親フォームを最小化後に子フォームを開きたい」のかという 意図が分からないのですが、要件を満たすためには、 子フォームの TopLevel は True でなければならないため、 『MDI 子フォーム』との両立は不可能だということです。
親フォームの最小化を諦めるか……あるいは、 一時的に MDI から SDI に変更するなどの 見直しを行ってみては如何でしょう。 |