DOBON.NET DOBON.NETプログラミング掲示板過去ログ

親フォームの最小化

環境/言語:[VB2010]
分類:[.NET]

親フォームから子フォームをShowDialogで起動する画面があるのですが、
子フォームを最小化すると親フォームは最小化せず画面に残ったままで
使用不可の状態なのですが、これを親フォームも同時に最小化するように
したいのですができるのでしょうか?

タスクバーから最大化する際には親子とも最大化して子フォームが使用可能
になって欲しいです。親フォームは使用不可能がいいです。showは使用したく
ないです。
■No28407に返信(ふぇあさんの記事)
> 親フォームは使用不可能がいいです。showは使用したく
> ないです。

とは言っても、親 Form を非活性化させた状態で Show メソッドにするのが早道です。
あとは、最小化のタイミングをイベントで実装すればよいです。

# モーダル ダイアログではオーナー側は制御が止まっているので、
# このイベントでの実装が困難です。
■No28407に返信(ふぇあさんの記事)

親フォームの最小化は出来ないです。非表示なら出来そうです。

Public Class Form1

    Private WithEvents m_fm2 As Form2

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        m_fm2 = New Form2
        m_fm2.ShowDialog(Me)
        '--- Form2が閉じられたときの処理
        m_fm2.Dispose()
    End Sub

    Private Sub m_fm2_SizeChanged(sender As Object, e As System.EventArgs) Handles m_fm2.SizeChanged
        If m_fm2.WindowState = FormWindowState.Minimized Then
            'Me.WindowState = FormWindowState.Minimized      '<-- これをやるとForm2はForm1から離れてHide状態になる。
            '-----------------------------------------------------Button1クリックのDisposeへ制御が移る
            Me.Hide()
        ElseIf Not Me.Visible Then
            Me.Visible = True
        End If
    End Sub
End Class
じゃんぬねっと様、shu様、お早いお返事ありがとうございます。

■No28409に返信(shuさんの記事)
参考にさせて頂きます。
追加の質問なのですが、親フォーム、子フォーム、孫フォームまであって
孫で最小化されたら親子全て隠すことは出来ますでしょうか?
知識不足ですいません。
■No28411に返信(ふぇあさんの記事)
> じゃんぬねっと様、shu様、お早いお返事ありがとうございます。
> 
> ■No28409に返信(shuさんの記事)
> 参考にさせて頂きます。
> 追加の質問なのですが、親フォーム、子フォーム、孫フォームまであって
> 孫で最小化されたら親子全て隠すことは出来ますでしょうか?
> 知識不足ですいません。

何階層でも試せるよう、同じフォームを開くようにしてあります。
VisibleChangedイベントを追加

Public Class Form1

    Private WithEvents m_fm2 As Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        m_fm2 = New Form1
        m_fm2.ShowDialog(Me)
        '--- Form2が閉じられたときの処理
        m_fm2.Dispose()
    End Sub

    Private Sub m_fm2_SizeChanged(sender As Object, e As System.EventArgs) Handles m_fm2.SizeChanged
        If m_fm2.WindowState = FormWindowState.Minimized Then
            Me.Hide()
        ElseIf Not Me.Visible Then
            Me.Visible = True
        End If
    End Sub

    Private Sub m_fm2_VisibleChanged(sender As Object, e As System.EventArgs) Handles m_fm2.VisibleChanged
        '--- 中間のフォームの可視が変わった場合、自分も合わせる
        If m_fm2.OwnedForms.Count > 0 Then
            If m_fm2.Visible Then
                If Not Me.Visible Then
                    Me.Visible = True
                End If
            Else
                If Me.Visible Then
                    Me.Hide()
                End If
            End If
        End If
    End Sub
End Class
shu様ありがとうございます。
大変参考になりました。

■No28412に返信(shuさんの記事)
> If m_fm2.OwnedForms.Count > 0 Then

この部分は私は初めて知りました。
この方法で問題解決しました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板