在VB.NET中将标签上的mouseEvents组合在一起

时间:2013-08-02 08:50:03

标签: vb.net label mouseevent

我想在标签上将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上触发的方法,并更改布尔变量的值。然后我会使用该变量作为条件将更改应用于标签。但是,这似乎不起作用......

如何以最佳方式实现这一目标?或者,完全没有?

的伪代码:     当鼠标输入标签时:         如果按下鼠标按钮则             做标签的东西

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

1 个答案:

答案 0 :(得分: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

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

澄清:我认为这(或这些方面的任何其他替代方案)都能提供出色的性能。如果你仍然不想那样,并且喜欢按下鼠标按钮来做任何事情,你将不得不依赖于不同的东西(例如,鼠标在屏幕上的位置,由其他方式触发的分析;或甚至来自不同的事件线程)。显而易见的是,您不能通过不同控件的单线程事件来完成您的目标(在前一个事件结束之前无法启动新事件)。