做循环直到按钮状态改变

时间:2015-10-09 19:43:14

标签: vb.net winforms

我想在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事件,因为拖放操作无法使用它。

1 个答案:

答案 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