WindowsフォームのIsMdiContainerプロパティをtrueにすることによりMDI親フォームとすると、フォームのBackColorプロパティは無視され、子フォームが表示されるくぼんだクライアント領域はシステムで指定された色(大抵は濃い灰色)になります。
このクライアント領域には、実はMdiClientというコントロールがあり、MdiClientコントロールのBackColorプロパティを変更することにより、クライアント領域の色を変えることができます。
注意:ただし、.NET Framework 1.1以前のヘルプによると、MdiClientクラスは「独自に作成したコード内で直接使用することはできません。」とありますので、この方法が適切であるかは保障できません。.NET Framework 2.0からは、このような文言はなくなりました。
まずフォームにあるMdiClientコントロールを探す次のような静的メソッドを作成します。
''' <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
/// <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; }
このメソッドを使って、MDI親フォームのクライアント領域にフォームのBackColorプロパティで指定された色を適用するコードは次のようになります。 (MDI親フォームのクラス内に記述するものとします。)
'MdiClientを探す Dim mc As System.Windows.Forms.MdiClient = GetMdiClient(Me) If Not (mc Is Nothing) Then '背景色を変更し、再描画する mc.BackColor = Me.BackColor mc.Invalidate() End If
//MdiClientを探す System.Windows.Forms.MdiClient mc = GetMdiClient(this); if (mc != null) { //背景色を変更し、再描画する mc.BackColor = this.BackColor; mc.Invalidate(); }
(この記事は、「.NETプログラミング研究 第42号」で紹介したものです。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。