2015-10-09 45 views
0

我想在一个WinForms mouseDown事件,能够做一些代码,直到一定的秒或MouseUp事件已经被解雇掉do while循环下去,直到按钮状态已经改变

我想是这样这

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秒,则切换到拖放模式,以便它们可以将所需的行移动到另一个datagridview。我试图使用Timer和StopWatch类,它不工作,我也不会期望它。如果我有鼠标点击事件和mousedown事件,因为mousedown在基本点击事件上执行,它不起作用。有任何想法吗?请记住,它不能依赖于mouseUp事件,因为拖放操作无法进行。

+0

为什么你一直试图改变代码片段?它编译得很好,让HitTestInfo可用对其他用途很重要。 –

+0

@HansPassant它不会编译,除非您告诉您调暗的是什么。只是说昏暗的命中= DataGridView1.HitTest(downPos.X,downPos.Y),而不作为条款不编译 –

+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