03 июня 2014
Кравченко Виктор

Form: Как перемещать форму за любое место, а не только за заголовок?

VB.NET Form
01

Для реализации данной задачи можно воспользоваться двумя способами. Первый из них подразумевает обработку события MouseDown и передачу окну соответствующего сообщения (message) — WM_NCLBUTTONDOWN с параметром HTCAPTION:

02 VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Class Form1 'Сообщения посылаемые формой - Windows Messages
Public Enum WM WM_NCLBUTTONDOWN = &HA1 ' ... End Enum
'Результаты исполнения функции DefWindowProc
Public Enum HT HTCAPTION = 2 ' ... End Enum
Private Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown Me.Capture = False ' Блокируем захват мыши Me.WndProc(Message.Create(Me.Handle, _ WM.WM_NCLBUTTONDOWN, _ HT.HTCAPTION, _ IntPtr.Zero)) End Sub
End Class
03

Как вы уже наверное догадались подобная практика применима к любому контролу:

04 VB.NET
1
2
3
4
5
6
7
8
' Позволяет перемещать кнопку по форме
Private Sub Button1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown Me.Button1.Capture = False ' Блокируем захват мыши Me.WndProc(Message.Create(Me.Button1.Handle, _ WM.WM_NCLBUTTONDOWN, _ HT.HTCAPTION, _ IntPtr.Zero)) End Sub
05

Второй способ подразумевает переопределение реакции в методе WndProc:

06 VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Public Class Form1 'Сообщения посылаемые формой - Windows Messages
Public Enum WM WM_NCLBUTTONDOWN = &HA1 ' ... End Enum
'Результаты исполнения функции DefWindowProc
Public Enum HT HTCAPTION = 2 ' ... End Enum
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Select Case m.Msg Case WM.WM_NCHITTEST ' Сообщение-запрос пришедшее от WM_NCLBUTTONDOWN m.Result = HT.HTCAPTION ' Выдаем место нажатия за заголовок Return ' Не даем вызвать базовый MyBase.WndProc(m) End Select MyBase.WndProc(m) End Sub
End Class
07

Оба способа имеют право на существование, каким из них пользоваться — решать вам.

09

Похожие запросы:

  • Как таскать форму за любое место
  • Как перемещать форму без заголовка
  • Перетаскивание формы за форму
  • Moving form without title bar
  • How to move a form without controlbox
comments powered by HyperComments