フォームを移動できないようにする
スポンサーリンク
フォームを移動できないようにするには、WndProc メソッドをオーバーライドし SC_MOVE を捕捉します。Windows API を使用しても良いのであれば DeleteMenu 関数から SC_MOVE を削除する方法でも可能です。この方法であれば、コントロール ボックスの「移動」を非活性化できます。今回は前者の方法を紹介します。
サンプルコード
以下にサンプルコードを示します。
VB.NET 全般
' WndProc メソッドをオーバーライドする Protected Overrides Sub WndProc(ByRef m As Message) Const WM_SYSCOMMAND As Integer = &H0112 Const SC_MOVE As Integer = &HF010 Const SC_MASK As Integer = &HFFF0 ' フォームの移動を捕捉したら以降の制御をカットする If (m.Msg = WM_SYSCOMMAND) AndAlso ((m.WParam.ToInt32() And SC_MASK) = SC_MOVE) Then Return End If ' 基本クラスのメソッドを実行する MyBase.WndProc(m) End Sub
VB6 に倣って移動できるかどうかを示す Moveable プロパティを実装したい場合は以下のようになります。
VB.NET 全般
Option Strict On ' 以下の名前空間をインポートする Imports System.Windows.Forms Imports System.ComponentModel Public Class Form1 : Inherits System.Windows.Forms.Form Windows フォーム デザイナで生成されたコード Private _Moveable As Boolean = True ''' ------------------------------------------------------------------------------ ''' <summary> ''' フォームが移動することが可能かどうかを示す値を取得または設定します。 ''' </summary> ''' ------------------------------------------------------------------------------ <Category ("配置 "), _ Description ("フォームが移動することが可能かどうかを判断します。"), _ DefaultValue(True)> _ Public Property Moveable() As Boolean Get Return Me._Moveable End Get Set Me._Moveable = Value End Set End Property Protected Overrides Sub WndProc(ByRef m As Message) If Me.Moveable = False Then Const WM_SYSCOMMAND As Integer = &H0112 Const SC_MOVE As Integer = &HF010 Const SC_MASK As Integer = &HFFF0 ' フォームの移動を捕捉したら以降の制御をカットする If m.Msg = WM_SYSCOMMAND AndAlso (m.WParam.ToInt32() And SC_MASK) = SC_MOVE Then Return End If End If ' 基本クラスのメソッドを実行する MyBase.WndProc(m) End Sub End Class
関連するリファレンス
準備中です。