|
■No73348 (ビール呑み さん) に返信 > web上のリソースを参考にvb.netプログラムの勉強をVS2010で始めたところでございます。 And ではなく AndAlso を…というのは些末な話として:
> ダブルクリックした場合には特定の処理を実行し、なおかつ最大化はキャンセル > したいのですが、フォーム最大化の命令を捕捉してキャンセルするといった処理は > 難しいのでしょうか?
HTCLIENT のままにしておけば、そもそも通常通り DoubleClick イベントが発生します。 HTCAPTION として扱ってしまっているが故に、話を難しくしてしまっているように思えます。
> ダブルクリックすると、フォームが最大化表示されてしまいます。 これを止めるだけならば、 Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = &H24 Then 'WM_GETMINMAXINFO Dim rect As Rectangle = Me.DesktopBounds Marshal.WriteInt32(m.LParam, 8, rect.Width) Marshal.WriteInt32(m.LParam, 12, rect.Height) Marshal.WriteInt32(m.LParam, 16, rect.Left) Marshal.WriteInt32(m.LParam, 20, rect.Top) Marshal.WriteInt32(m.LParam, 24, SystemInformation.MinWindowTrackSize.Width) Marshal.WriteInt32(m.LParam, 28, SystemInformation.MinWindowTrackSize.Height) Marshal.WriteInt32(m.LParam, 32, SystemInformation.MaxWindowTrackSize.Width) Marshal.WriteInt32(m.LParam, 36, SystemInformation.MaxWindowTrackSize.Height) m.Result = IntPtr.Zero などという方法もありますが、「ダブルクリックされた時の処理」を 残したいのであれば、そもそも、HTCAPTION への変換を止めた方が良いでしょう。
WndProc のオーバーライドを行わず、移動処理のみを実装してみました。
Public Class Form1 Private Sub Form1_DoubleClick(sender As Object, e As EventArgs) Handles Me.DoubleClick MsgBox("Double Clicked!") 'ダブルクリック時に処理させたい内容 End Sub
Private mouseDownPoint As Point? = Nothing 'ドラッグ開始座標 Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown If (e.Button And MouseButtons.Left) = MouseButtons.Left Then mouseDownPoint = e.Location End If End Sub
Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp If (e.Button And MouseButtons.Left) = MouseButtons.Left Then mouseDownPoint = Nothing 'ドラッグ終了 End If End Sub
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove If mouseDownPoint.HasValue Then 'ドラッグで座標移動 Dim pos As Point = Me.Location pos.Offset(e.Location - mouseDownPoint.Value) Me.Location = pos End If End Sub End Class
|