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

フォームを最大化、最小化できないようにする

ここでは、フォームが最大化、あるいは、最小化されるのを防ぐ方法を幾つか紹介します。

MaximizeBox、MinimizeBoxをFalseにする方法

フォームのMaximizeBoxプロパティMinimizeBoxプロパティをFalseにすることでタイトルバーの最大化、最小化ボタンを無効(あるいは、非表示)にすることができます。このようにすると、コントロールボックスメニューの「最大化」と「最小化」の項目も無効になり、Aeroスナップや「Win + ↑」と「Win + 下」のショートカットキーによる最大化と最小化、タイトルバーのダブルクリックによる最大化も防ぎます。

ただし例外として、フォームのFormBorderStyleプロパティがNoneの場合は、このようにしても「Win + ↑」キーで最大化ができてしまいます。また、FormBorderStyleプロパティがNoneで、「タイトルバーのないフォームを移動できるようにする」で紹介している「WndProcをオーバーライドする方法」を使用している場合は、ダブルクリックやAeroスナップで最大化できてしまいます。

補足:フォームのFormBorderStyleプロパティがFixedToolWindowやSizableToolWindowで、はじめから最大化、最小化ボタンがなかったとしても、MaximizeBoxプロパティやMinimizeBoxプロパティをFalseにすることで、ショートカットキーやタイトルバーのダブルクリック等で最大化、最小化されるのを防ぐことができます。

以下の例では、自分自身のMaximizeBoxとMinimizeBoxプロパティをFalseにして、最大化と最小化されないようにしています。

VB.NET
コードを隠すコードを選択
'フォームが最大化されないようにする
Me.MaximizeBox = False
'フォームが最小化されないようにする
Me.MinimizeBox = False
C#
コードを隠すコードを選択
//フォームが最大化されないようにする
this.MaximizeBox = false;
//フォームが最小化されないようにする
this.MinimizeBox = false;

タイトルバーがダブルクリックされた時に最大化されないようにする

タイトルバーがダブルクリックされた時にフォームが最大化されないようにするには、WM_NCLBUTTONDBLCLKメッセージを利用するという方法があります。

この方法による例を以下に示します。このコードは、対象とするフォームのクラス内に記述してください。

VB.NET
コードを隠すコードを選択
'Imports System.Security.Permissions

<SecurityPermission(SecurityAction.Demand, _
    Flags:=SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_NCLBUTTONDBLCLK As Integer = &HA3

    If m.Msg = WM_NCLBUTTONDBLCLK Then
        '非クライアント領域がダブルクリックされた時
        m.Result = IntPtr.Zero
        Return
    End If

    MyBase.WndProc(m)
End Sub
C#
コードを隠すコードを選択
//using System.Security.Permissions;

[SecurityPermission(SecurityAction.Demand,
    Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
    const int WM_NCLBUTTONDBLCLK = 0xA3;

    if (m.Msg == WM_NCLBUTTONDBLCLK)
    {
        //非クライアント領域がダブルクリックされた時
        m.Result = IntPtr.Zero;
        return;
    }

    base.WndProc(ref m);
}

最大化、最小化された時に通常状態に戻す方法

フォームが最大化、最小化された時、すぐに通常状態に戻すという方法も考えられます。この方法は、「フォームが最小化あるいは最大化されたことを知る」と「フォームを最小化あるいは最大化する」を組み合わせれば、簡単にできます。ただし一瞬は最大化、最小化されますので、厳密な意味でこれらを防いだとは言えないかもしれません。

以下の例では、フォームのSizeChangedイベントが発生した時に最大化、最小化されているかを調べ、されていれば元に戻しています。

VB.NET
コードを隠すコードを選択
'SizeChangedイベントハンドラ
Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) _
        Handles MyBase.SizeChanged
    'フォームが最小化、最大化された時は、元の状態に戻す
    If Me.WindowState = FormWindowState.Minimized OrElse _
        Me.WindowState = FormWindowState.Maximized Then

        Me.WindowState = FormWindowState.Normal
    End If
End Sub
C#
コードを隠すコードを選択
//SizeChangedイベントハンドラ
private void Form1_SizeChanged(object sender, EventArgs e)
{
    //フォームが最小化、最大化された時は、元の状態に戻す
    if (this.WindowState == FormWindowState.Minimized ||
        this.WindowState == FormWindowState.Maximized)
    {
        this.WindowState = FormWindowState.Normal;
    }
}

MaximizedBoundsプロパティを設定する方法

MaximizedBoundsプロパティを設定すると、フォームが最大化された時の大きさと位置を決めておくことができます。また、MaximumSizeプロパティを設定すると、フォームが最大化されてもそれ以上サイズが大きくなりません。そのため、これらのプロパティを使用すると、最大化されても画面全体がフォームで覆われることはなくなります。最大化を防ぐという訳ではありませんが、念のために設定しておくとよいかもしれません。

MaximizedBoundsプロパティについては「フォームが最大化されたときのサイズを指定する」で、MaximumSizeプロパティについては「フォームのサイズを制限する」で説明しています。

以下の例では、フォームが現在の大きさより大きくならないようにしています。

VB.NET
コードを隠すコードを選択
'フォームの現在の大きさを最大サイズとする
Me.MaximumSize = Me.Size
C#
コードを隠すコードを選択
//フォームの現在の大きさを最大サイズとする
this.MaximumSize = this.Size;

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。