ここでは、フォームが最大化、あるいは、最小化されるのを防ぐ方法を幾つか紹介します。
フォームのMaximizeBoxプロパティやMinimizeBoxプロパティをFalseにすることでタイトルバーの最大化、最小化ボタンを無効(あるいは、非表示)にすることができます。このようにすると、コントロールボックスメニューの「最大化」と「最小化」の項目も無効になり、Aeroスナップや「Win + ↑」と「Win + 下」のショートカットキーによる最大化と最小化、タイトルバーのダブルクリックによる最大化も防ぎます。
ただし例外として、フォームのFormBorderStyleプロパティがNoneの場合は、このようにしても「Win + ↑」キーで最大化ができてしまいます。また、FormBorderStyleプロパティがNoneで、「タイトルバーのないフォームを移動できるようにする」で紹介している「WndProcをオーバーライドする方法」を使用している場合は、ダブルクリックやAeroスナップで最大化できてしまいます。
補足:フォームのFormBorderStyleプロパティがFixedToolWindowやSizableToolWindowで、はじめから最大化、最小化ボタンがなかったとしても、MaximizeBoxプロパティやMinimizeBoxプロパティをFalseにすることで、ショートカットキーやタイトルバーのダブルクリック等で最大化、最小化されるのを防ぐことができます。
以下の例では、自分自身のMaximizeBoxとMinimizeBoxプロパティをFalseにして、最大化と最小化されないようにしています。
'フォームが最大化されないようにする Me.MaximizeBox = False 'フォームが最小化されないようにする Me.MinimizeBox = False
//フォームが最大化されないようにする this.MaximizeBox = false; //フォームが最小化されないようにする this.MinimizeBox = false;
タイトルバーがダブルクリックされた時にフォームが最大化されないようにするには、WM_NCLBUTTONDBLCLKメッセージを利用するという方法があります。
この方法による例を以下に示します。このコードは、対象とするフォームのクラス内に記述してください。
'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
//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イベントが発生した時に最大化、最小化されているかを調べ、されていれば元に戻しています。
'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
//SizeChangedイベントハンドラ private void Form1_SizeChanged(object sender, EventArgs e) { //フォームが最小化、最大化された時は、元の状態に戻す if (this.WindowState == FormWindowState.Minimized || this.WindowState == FormWindowState.Maximized) { this.WindowState = FormWindowState.Normal; } }
MaximizedBoundsプロパティを設定すると、フォームが最大化された時の大きさと位置を決めておくことができます。また、MaximumSizeプロパティを設定すると、フォームが最大化されてもそれ以上サイズが大きくなりません。そのため、これらのプロパティを使用すると、最大化されても画面全体がフォームで覆われることはなくなります。最大化を防ぐという訳ではありませんが、念のために設定しておくとよいかもしれません。
MaximizedBoundsプロパティについては「フォームが最大化されたときのサイズを指定する」で、MaximumSizeプロパティについては「フォームのサイズを制限する」で説明しています。
以下の例では、フォームが現在の大きさより大きくならないようにしています。
'フォームの現在の大きさを最大サイズとする Me.MaximumSize = Me.Size
//フォームの現在の大きさを最大サイズとする this.MaximumSize = this.Size;