我想在标签上将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上触发的方法,并更改布尔变量的值。然后我会使用该变量作为条件将更改应用于标签。但是,这似乎不起作用......
如何以最佳方式实现这一目标?或者,完全没有?
的伪代码: 当鼠标输入标签时: 如果按下鼠标按钮则 做标签的东西
编辑: 当按下鼠标按钮并将光标拖过多个标签时,它也必须工作。按下左键时光标所经过的所有标签都应该更改。
答案 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)。如您所见,这可以提供与您想要的相同的性能,并与事件的工作方式兼容。
澄清:我认为这(或这些方面的任何其他替代方案)都能提供出色的性能。如果你仍然不想那样,并且喜欢按下鼠标按钮来做任何事情,你将不得不依赖于不同的东西(例如,鼠标在屏幕上的位置,由其他方式触发的分析;或甚至来自不同的事件线程)。显而易见的是,您不能通过不同控件的单线程事件来完成您的目标(在前一个事件结束之前无法启动新事件)。