среда, 21 июля 2010 г.

VB.Net. Перетаскивание элемента управления мышью по форме

В данном примере мышью по форме перетаскивается элемент управления Label. Конечно, подобным образом может перетаскиваться и любой другой контрол, и не только по форме. Во время перемещения указателя мыши по элементу управления (при нажатой кнопке мыши) положение элемента управления изменяется на величину смещения указателя относительно исходной позиции контрола. Ну, вобщем, вроде бы, все понятно. :) Остальные комментарии смотрите в коде.


Public Class Form1

    Private isMouseDown As Boolean = False 'признак удерживания кнопки мыши
    Private StartPoint As Point 'начальная позиция элемента управления

    Private Sub Label1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then 'если нажата левая кнопка мыши
            isMouseDown = True
            StartPoint = e.Location 'запоминаем текущую позицию элемента управления
            Label1.Cursor = Cursors.SizeAll 'меняем вид указателя мыши над элементом управления
        End If
    End Sub

    Private Sub Label1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseUp
        isMouseDown = False
        Label1.Cursor = Cursors.Default 'восстанавливаем вид курсора
    End Sub

    Private Sub Label1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseMove
        If isMouseDown Then 'если кнопка мыши удерживается
            'вычисляем новые координаты элемента управления
            Label1.Left += (e.X - StartPoint.X)
            Label1.Top += (e.Y - StartPoint.Y)
        End If
    End Sub

    Private Sub Label1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.LocationChanged
        'если большая часть элемента управления выходит за границу формы, возвращаем его в центр
        Dim w2 As Integer = Convert.ToInt32(Label1.Width / 2)
        Dim h2 As Integer = Convert.ToInt32(Label1.Height / 2)
        If Label1.Top < -h2 Or Label1.Left < -w2 Or Label1.Top > Me.ClientSize.Height - h2 Or Label1.Left > Me.ClientSize.Width - w2 Then
            Label1.Location = New Point(Convert.ToInt32(Me.ClientSize.Width / 2) - w2, Convert.ToInt32(Me.ClientSize.Height / 2) - h2)
            isMouseDown = False
            Label1.Cursor = Cursors.Default
        End If
    End Sub

End Class

Комментариев нет:

Отправить комментарий

Го вверх!