我想在Winforms中的MouseDown事件中能够执行一些代码,直到某个秒或者MouseUp事件被触发为止
我想要这样的东西
Dim counter As Integer = 0
Do Until Button.Key IsNot MouseDown
counter += 1
If counter > 3
Exit Do Loop
End If
Application.DoEvents()
Loop
现在我有点像
seconds = 0
m_mouseButtonIsNotDown = False
Do Until m_mouseButtonIsNotDown
If e.Button = Windows.Forms.MouseButtons.Left Then
seconds += 1
If seconds > 5 Then
m_mouseButtonIsNotDown = True
End If
End If
Application.DoEvents()
Loop
我正在寻找的理想行为是,如果他们在一定数量的循环中放开按钮来处理代码,如果它只是一个简单的鼠标点击事件。如果mousedown已被保持超过3或5秒,则切换到拖放模式,以便他们可以将所需的行移动到另一个数据网格视图。我曾尝试使用Timer和StopWatch类,但它并没有像我预期的那样工作。如果我有一个鼠标点击事件和mousedown事件,因为mousedown在基本点击事件上执行,它不起作用。有任何想法吗?请记住,它不能依赖于mouseUp事件,因为拖放操作无法使用它。
答案 0 :(得分:2)
从不,从不使用DoEvents()来解决问题。可以使计时器工作。但这不是正确的方法。当用户在按住左按钮的同时移动鼠标时,您想要开始拖动。像这样:
Private downPos As Point
Private Sub DataGridView1_MouseDown(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseDown
downPos = e.Location
End Sub
Private Sub DataGridView1_MouseMove(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseMove
If e.Button = MouseButtons.Left Then
If Math.Abs(downPos.X - e.X) >= SystemInformation.DoubleClickSize.Width Or
Math.Abs(downPos.Y - e.Y) >= SystemInformation.DoubleClickSize.Height Then
Dim hit = DataGridView1.HitTest(downPos.X, downPos.Y)
If hit.RowIndex >= 0 Then
'' Start dragging row
''...
End If
End If
End If
End Sub