DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

MDI親フォームの背景色を変更する

WindowsフォームのIsMdiContainerプロパティをtrueにすることによりMDI親フォームとすると、フォームのBackColorプロパティは無視され、子フォームが表示されるくぼんだクライアント領域はシステムで指定された色(大抵は濃い灰色)になります。

このクライアント領域には、実はMdiClientというコントロールがあり、MdiClientコントロールのBackColorプロパティを変更することにより、クライアント領域の色を変えることができます。

注意:ただし、.NET Framework 1.1以前のヘルプによると、MdiClientクラスは「独自に作成したコード内で直接使用することはできません。」とありますので、この方法が適切であるかは保障できません。.NET Framework 2.0からは、このような文言はなくなりました。

まずフォームにあるMdiClientコントロールを探す次のような静的メソッドを作成します。

VB.NET
コードを隠すコードを選択
''' <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
C#
コードを隠すコードを選択
/// <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親フォームのクラス内に記述するものとします。)

VB.NET
コードを隠すコードを選択
'MdiClientを探す
Dim mc As System.Windows.Forms.MdiClient = GetMdiClient(Me)
If Not (mc Is Nothing) Then
    '背景色を変更し、再描画する
    mc.BackColor = Me.BackColor
    mc.Invalidate()
End If
C#
コードを隠すコードを選択
//MdiClientを探す
System.Windows.Forms.MdiClient mc = GetMdiClient(this);
if (mc != null)
{
    //背景色を変更し、再描画する
    mc.BackColor = this.BackColor;
    mc.Invalidate();
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。