MDI親フォームに子フォームを追加、あるいは削除するという動作は、開発者がそのようなコードを書くことにより可能となるため、MDI親フォームに子フォームが追加、削除されたかという判断は、開発者自身ができるはずです。
もちろんこのような方法がベストですし、全く問題ありませんが、「MDI親フォームの背景色を変更する」で紹介したMdiClientコントロールのControlAdded、ControlRemovedイベントを使えば、子フォームの追加、削除をイベントで知ることができます。
注意:ただし、.NET Framework 1.1以前のヘルプによると、MdiClientクラスは「独自に作成したコード内で直接使用することはできません。」とありますので、この方法が適切であるかは保障できません。.NET Framework 2.0からは、このような文言はなくなりました。
以下にサンプルを示します。このコードはMDI親フォームに記述されており、ParentForm_LoadはフォームのLoadイベントハンドラとして登録されているものとします。
'MDI親フォームのLoadイベントハンドラ Private Sub ParentForm_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True 'MdiClientの取得 Dim mc As System.Windows.Forms.MdiClient = GetMdiClient(Me) 'MdiClientのControlAddedとControlRemovedイベントハンドラを追加 AddHandler mc.ControlAdded, AddressOf mc_ControlAdded AddHandler mc.ControlRemoved, AddressOf mc_ControlRemoved End Sub Private Sub mc_ControlAdded( _ ByVal sender As Object, ByVal e As ControlEventArgs) Console.WriteLine("子フォームが追加されました。") End Sub 'mc_ControlAdded Private Sub mc_ControlRemoved( _ ByVal sender As Object, ByVal e As ControlEventArgs) Console.WriteLine("子フォームが削除されました。") End Sub 'mc_ControlRemoved ''' <summary> ''' フォームのMdiClientコントロールを探して返す ''' </summary> ''' <param name="f">MdiClientコントロールを探すフォーム</param> ''' <returns>見つかったMdiClientコントロール</returns> Public Shared Function GetMdiClient( _ ByVal f As System.Windows.Forms.Form) _ As System.Windows.Forms.MdiClient Dim c As System.Windows.Forms.Control For Each c In f.Controls If TypeOf c Is System.Windows.Forms.MdiClient Then Return CType(c, System.Windows.Forms.MdiClient) End If Next c Return Nothing End Function
//MDI親フォームのLoadイベントハンドラ private void ParentForm_Load(object sender, System.EventArgs e) { this.IsMdiContainer = true; //MdiClientの取得 System.Windows.Forms.MdiClient mc = GetMdiClient(this); //MdiClientのControlAddedとControlRemovedイベントハンドラを追加 mc.ControlAdded += new ControlEventHandler(mc_ControlAdded); mc.ControlRemoved += new ControlEventHandler(mc_ControlRemoved); } private void mc_ControlAdded(object sender, ControlEventArgs e) { Console.WriteLine("子フォームが追加されました。"); } private void mc_ControlRemoved(object sender, ControlEventArgs e) { Console.WriteLine("子フォームが削除されました。"); } /// <summary> /// フォームのMdiClientコントロールを探して返す /// </summary> /// <param name="f">MdiClientコントロールを探すフォーム</param> /// <returns>見つかったMdiClientコントロール</returns> public static System.Windows.Forms.MdiClient GetMdiClient(System.Windows.Forms.Form f) { foreach (System.Windows.Forms.Control c in f.Controls) if (c is System.Windows.Forms.MdiClient) return (System.Windows.Forms.MdiClient) c; return null; }