0

我需要拖动表单上的任何标签。

我正在使用此代码,问题是它只移动了 1 个标签label1 ,我可以复制粘贴几次并且它可以工作,但我正在使用代码向表单添加新标签,并且该代码看不到它们。

如何单击并拖动表单上的任何标签?

Public Class Form1
    Dim lbl As Label
    Dim Off As Point
    Private Sub obj1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles label1.MouseDown

        Off.X = MousePosition.X - sender.Left
        Off.Y = MousePosition.Y - sender.Top
    End Sub
    Private Sub obj1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles label1.MouseMove
        If e.Button = MouseButtons.Left Then
            sender.Left = MousePosition.X - Off.X
            sender.Top = MousePosition.Y - Off.Y
        End If
    End Sub
End Class
4

2 回答 2

1

“我想拖动位于表单中的任何标签”

不要用“Handles xxx.yyy”子句硬连接处理程序,而是在运行时在表单的 Load() 事件中连接它们:

Public Class Form1

    Dim Off As Point

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        WireLabels(Me)
    End Sub

    Private Sub WireLabels(ByVal cont As Control)
        For Each ctl As Control In cont.Controls
            If TypeOf ctl Is Label Then
                AddHandler ctl.MouseDown, AddressOf obj1_MouseDown
                AddHandler ctl.MouseMove, AddressOf obj1_MouseMove
            ElseIf ctl.HasChildren Then
                WireLabels(ctl)
            End If
        Next
    End Sub

    Private Sub obj1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Off.X = MousePosition.X - sender.Left
        Off.Y = MousePosition.Y - sender.Top
    End Sub

    Private Sub obj1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If e.Button = MouseButtons.Left Then
            sender.Left = MousePosition.X - Off.X
            sender.Top = MousePosition.Y - Off.Y
        End If
    End Sub

End Class

显然,您也可以将 AddHandler 用于运行时创建的任何标签。

于 2013-10-11T15:56:29.317 回答
0

将您的代码更改为:

Private Sub obj1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 

    Off.X = MousePosition.X - sender.Left
    Off.Y = MousePosition.Y - sender.Top
End Sub
Private Sub obj1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    If e.Button = MouseButtons.Left Then
        sender.Left = MousePosition.X - Off.X
        sender.Top = MousePosition.Y - Off.Y
    End If
End Sub

在你的表单加载中有这个:

AddHandler label1.MouseDown, Addressof obj1_MouseDown
AddHandler label1.MouseMove, Addressof obj1_MouseMove

在您的标签创建代码中:

dim aLabel as label = new Label
AddHandler aLabel.MouseDown, Addressof obj1_MouseDown
AddHandler aLabel.MouseMove, Addressof obj1_MouseMove
...

您需要在创建对象后将处理程序添加到对象,否则表单不知道如何处理这些事件。

于 2013-10-11T15:53:36.887 回答