VB.NET AddHandler для программно созданного объекта

У меня есть этот код для перемещения с моими формами.

Public BeingDragged As Boolean = False
Public MouseDownX As Integer
Public MouseDownY As Integer

Private Sub Mouse_Down(sender As Object, e As MouseEventArgs)
    If e.Button = MouseButtons.Left Then
        BeingDragged = True
        MouseDownX = e.X
        MouseDownY = e.Y
    End If
End Sub
Private Sub TopPanel_MouseUp(sender As Object, e As MouseEventArgs)
    If e.Button = MouseButtons.Left Then
        BeingDragged = False
    End If
End Sub
Private Sub TopPanel_MouseMove(sender As Object, e As MouseEventArgs)
    If BeingDragged = True Then
        Dim tmp As Point = New Point()

        tmp.X = Form.Location.X + (e.X - MouseDownX)
        tmp.Y = Form.Location.Y + (e.Y - MouseDownY)
        Form.Location = tmp
        tmp = Nothing
    End If
End Sub

Но как я могу использовать это для перемещения с программно созданной формой. Я пробовал AddHandler Top_Panel.MouseDown с лямбдой, а также с адресом, но ничего не работает. Потому что адрес должен быть без круглых скобок, и я не знаю, как я могу определить e как MouseEventArgs без него. Заранее спасибо.


person Skulaurun Mrusal    schedule 28.07.2018    source источник
comment
Вам нужен конструктор, чтобы вы могли передать ссылку Form и подписаться на события. Также было бы разумно поместить этот код в класс, производный от Form. Теперь он может быть базовым классом для любой создаваемой вами формы, которая должна быть перемещаемой таким образом, и вам не нужно писать дополнительный код для его использования.   -  person Hans Passant    schedule 28.07.2018
comment
Спасибо Ханс Пассант.   -  person Skulaurun Mrusal    schedule 28.07.2018


Ответы (1)


Просто отвечая на вопрос, я неправильно использовал AddHandler. Этот код работает нормально. Также благодаря Хансу Пассанту лучшим решением было бы наследование класса Form и создание моего собственного производного класса MovableForm.

Module Program

    Sub Main()

        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)

        Dim Form As Form = New Form With {
            .Size = New Size(100, 100),
            .FormBorderStyle = FormBorderStyle.None
        }

        Dim BeingDragged As Boolean = False
        Dim MouseDownX, MouseDownY As Integer

        AddHandler Form.MouseDown, Sub(sender As Object, e As MouseEventArgs)
                                       If e.Button = MouseButtons.Left Then
                                           BeingDragged = True
                                           MouseDownX = e.X
                                           MouseDownY = e.Y
                                       End If
                                   End Sub
        AddHandler Form.MouseUp, Sub(sender As Object, e As MouseEventArgs)
                                     If e.Button = MouseButtons.Left Then
                                         BeingDragged = False
                                     End If
                                 End Sub
        AddHandler Form.MouseMove, Sub(sender As Object, e As MouseEventArgs)
                                       If BeingDragged = True Then
                                           Dim tmp As Point = New Point With {
                                               .X = Form.Location.X + (e.X - MouseDownX),
                                               .Y = Form.Location.Y + (e.Y - MouseDownY)
                                           }
                                           Form.Location = tmp
                                           tmp = Nothing
                                       End If
                                   End Sub

        Application.Run(Form)

    End Sub

End Module

person Skulaurun Mrusal    schedule 03.09.2019