C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

親フォームを最小化後に子フォームを開くには /はる (20/03/25(Wed) 11:39) #94208
Re[1]: 親フォームを最小化後に子フォームを開くには /魔界の仮面弁士 (20/03/25(Wed) 12:37) #94213
  └ Re[2]: 親フォームを最小化後に子フォームを開くには /はる (20/03/25(Wed) 13:52) #94215
    └ Re[3]: 親フォームを最小化後に子フォームを開くには /魔界の仮面弁士 (20/03/25(Wed) 15:15) #94216
      └ Re[4]: 親フォームを最小化後に子フォームを開くには /はる (20/03/25(Wed) 22:13) #94223
        └ Re[5]: 親フォームを最小化後に子フォームを開くには /はる (20/03/26(Thu) 12:17) #94234 解決済み


親記事 / ▼[ 94213 ]
■94208 / 親階層)  親フォームを最小化後に子フォームを開くには
□投稿者/ はる (1回)-(2020/03/25(Wed) 11:39:45)

分類:[VB.NET/VB2005 以降] 

親フォームを最小化した後に子フォームを開きたいです。
どのようにすれば良いのか、ご教授のほどお願いします。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.SetBounds(0, 0, 1000, 800, BoundsSpecified.All)
        'このフォームを MDI コンテナとして設定 
        Me.IsMdiContainer = True
    End Sub

    '子フォーム Test1を開く
    Private Sub Test1ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles Test1ToolStripMenuItem.Click
        Dim frmchild As New Form2
        frmchild.MdiParent = Me
        frmchild.Show()

        '自分自身のフォームを最小化
        'Me.WindowState = FormWindowState.Minimized
    End Sub
End Class

Public Class Form2
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.SetBounds(300, 100, 500, 200, BoundsSpecified.All)
    End Sub

    'このフォームを閉じる
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Close()
    End Sub
End Class

[ □ Tree ] 返信 編集キー/

▲[ 94208 ] / ▼[ 94215 ]
■94213 / 1階層)  Re[1]: 親フォームを最小化後に子フォームを開くには
□投稿者/ 魔界の仮面弁士 (2638回)-(2020/03/25(Wed) 12:37:25)
No94208 (はる さん) に返信
> 親フォームを最小化した後に子フォームを開きたいです。

その子フォームの MdiParent が Nothing かどうかが肝です。


MDI 子フォームでは無い場合(MdiParent が Nothing)は、
 Dim f As New YourChildForm()
 Me.WindowState = FormWindowState.Minimized
 f.Show(Me)
のように書けます。


MDI 子フォームの場合(MdiParent が設定されている)は無理ですね。
MDI 子フォームはトップレベルウィンドウではなく、
フォーム上に貼られたコントロールのように扱われるためです。

MDI 親フォーム
┗System.Windows.Forms.MdiClient コントロール
 ┗MDI 子フォーム
[ 親 94208 / □ Tree ] 返信 編集キー/

▲[ 94213 ] / ▼[ 94216 ]
■94215 / 2階層)  Re[2]: 親フォームを最小化後に子フォームを開くには
□投稿者/ はる (2回)-(2020/03/25(Wed) 13:52:24)
No94213 (魔界の仮面弁士 さん) に返信

> MDI 子フォームの場合(MdiParent が設定されている)は無理ですね。

親フォーム(Form1)に、MenuStripコントロールを使ってメニューも作ってますので、これに当たるかと思います。
対策としてはRadioButtonなどにすべきなのでしょうか?

よろしくお願いします。



[ 親 94208 / □ Tree ] 返信 編集キー/

▲[ 94215 ] / ▼[ 94223 ]
■94216 / 3階層)  Re[3]: 親フォームを最小化後に子フォームを開くには
□投稿者/ 魔界の仮面弁士 (2639回)-(2020/03/25(Wed) 15:15:36)
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 に変更するなどの
見直しを行ってみては如何でしょう。
[ 親 94208 / □ Tree ] 返信 編集キー/

▲[ 94216 ] / ▼[ 94234 ]
■94223 / 4階層)  Re[4]: 親フォームを最小化後に子フォームを開くには
□投稿者/ はる (3回)-(2020/03/25(Wed) 22:13:42)
2020/03/25(Wed) 22:17:46 編集(投稿者)

No94216 (魔界の仮面弁士 さん) に返信

> 何故、「親フォームを最小化後に子フォームを開きたい」のかという

複数ある子フォームの大きさの最大値に合わせて、親フォームも作る必要がありますよね。
他のプログラムと連動して使うため邪魔にもなるからです。

> 新規プロジェクトで、下記を試してみてください。
試してもみましたが今回の場合には合いませんでした。

ありがとうございます。
中々難しそうなので、もう少し考えてもみます。

[ 親 94208 / □ Tree ] 返信 編集キー/

▲[ 94223 ] / 返信無し
■94234 / 5階層)  Re[5]: 親フォームを最小化後に子フォームを開くには
□投稿者/ はる (4回)-(2020/03/26(Thu) 12:17:26)
解決にするのを忘れてました。
解決済み
[ 親 94208 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -