0

我想在标签上将 MouseEnter 与 MousePressed 结合起来。

Public Sub populateGrid()
    lblTest.BackColor()
    lblTest.BackColor = System.Drawing.Color.Red
    gbWorkflow.Controls.Add(lblTest)
    For j As Integer = 1 To 40
        For i As Integer = 1 To 20
            Dim L As New Label
            L.Size = New Size(30, 30)
            L.Text = "L:" + i.ToString + j.ToString
            L.BackColor = Color.AliceBlue
            Dim x, y As Integer
            Dim loc As Point = gbWorkflow.Location
            y = loc.Y * (i * 8) '- (gbWorkflow.Height + L.Size.Height) * i
            x = loc.X * (j * 8)

            L.Location = New Point(x, y)

            gbWorkflow.Controls.Add(L)

            AddHandler L.MouseEnter, AddressOf L_Enter
            AddHandler L.MouseLeave, AddressOf L_Leave
        Next
    Next
End Sub
Private Sub L_Enter(ByVal sender As Object, ByVal e As System.EventArgs)

        Dim TheLabel As Label = CType(sender, Label)
        TheLabel.BackColor = Color.Red

End Sub

我的想法是创建一个在 MouseDown 上触发并更改布尔变量值的方法。然后,我将使用该变量作为将更改应用于标签的条件。然而,这似乎不起作用......

我怎样才能以最好的方式实现这一目标?或者,根本没有?

伪代码:当鼠标输入标签时:如果按下鼠标左键,则使用标签执行操作

编辑:当仍然按下鼠标按钮并将光标拖到多个标签上时,它也必须工作。按下左键时光标穿过的所有标签都应更改。

4

1 回答 1

1

MouseDown活动提供您所追求的。示例代码:

Private Sub L_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs)
    If (e.Button = Windows.Forms.MouseButtons.Left) Then
        'Do stuff
    End If
End Sub

添加事件处理程序:

AddHandler L.MouseDown, AddressOf L_MouseDown

- - 更新

如前所述,您无法直接完成您想要的,但有许多替代方法可以提供同等性能。例如:

指示是否已单击目标标签之一的布尔标志 ( MouseDown) +MouseEnter仅当此标志为真时才执行修改。示例代码:

Private LWasClicked As Boolean = False


Private Sub L_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs)
    If (e.Button = Windows.Forms.MouseButtons.Left And Not LWasClicked) Then
        LWasClicked = True
    End If
End Sub

Private Sub L_MouseEnter(sender As Object, e As System.EventArgs)
    If (LWasClicked) Then
        'Do stuff
    End If
End Sub

使用上面的代码,您只需单击任何标签(或特定标签)即可“激活编辑”;激活后,您只需将鼠标移到任何标签上即可执行操作。您还必须设置一个事件来取消激活此行为(例如:新的 Click/MouseDown)。如您所见,这提供了与您想要的相同的性能,并且与事件的工作方式兼容。

澄清:我认为这个(或这些线路上的任何其他替代方案)提供了出色的性能。如果您仍然不希望这样做并且更喜欢在按下鼠标按钮的情况下执行所有操作,您将不得不依赖不同的东西(例如,鼠标在屏幕上的位置、由其他方式触发的分析;甚至来自不同的事件)线程)。很明显,您的目标无法通过不同控件的单线程事件来完成(在前一个事件结束之前无法启动新事件)。

于 2013-08-02T08:55:28.053 回答