作了个按钮控件,发现VB的MOUSE_DOWN事件,在MOUSE快速单击的时候,有时是响应不了(就是明明按了MOUSE,有时会没有发生这个事件).但是普通的按钮控件,你不停的在上面单击,它都是可以响应的.不明白为什么VB的MOUSE_DOWN会这个样?有没有解决的方法,最理想不用子类消息.

解决方案 »

  1.   

    各位兄弟:谁有BT MSDN下载的种子啊! 发给我好吗[email protected]
      

  2.   

    很简单呀,只是一个我做的按钮.要得到快速响应MOUSE DOWN的消息.普通的MOUSE DOWN事件,有时候你用MOUSE快速单击是响应不了的.但是VB6的按钮,为什么你用MOUSE在上面快速单击,不管MOUSE有多快,它都可以响应到!!!
      

  3.   

    其实楼主的问题出现在鼠标按键事件出现的时间。当用户第一次按下鼠标左键(右键)的时候,出现事件leftmousedown(rightmousedown),然后用户松开左键(右键),出现事件leftmouseup(rightmouseup),紧接着是click事件。当用户再次按下鼠标左键(右键)的时候,如果此时距离上次leftmousedown(rightmousedown)事件在一定的时间之内,那么出现的不是leftmousedown(rightmousedown)事件,而是doubleclick事件。然后当用户再次松开鼠标左键(右键)的时候,出现leftmouseup(rightmouseup)事件。这样就完成了一个循环。而楼主所说的commandbutton是没有doubleclick事件的。综上所述,我们只要按照commandbutton的做法屏蔽掉usercontrol的doubleclick事件即可。那么有比较直接两种方法,第一种是在usercontrol的doubleclick中raiseevent我们的mousedown事件,另外一种就是在mousedown的时候模拟一次鼠标左键(右键)按键,使之产生usercontrol的doubleclick事件。显然第二种方法更适合,因为我们不用去判断shift参数。下面是简单的实现
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Type POINTAPI
            x As Long
            y As Long
    End Type
    Private Const MOUSEEVENTF_LEFTDOWN = &H2 '  left button down
    Private Const MOUSEEVENTF_RIGHTDOWN = &H8 '  right button downPublic Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim MyPoint As POINTAPI
        If Button = vbLeftButton Then
            GetCursorPos MyPoint
            mouse_event MOUSEEVENTF_LEFTDOWN, MyPoint.x, MyPoint.y, 0, 0
        ElseIf Button = vbRightButton Then
            GetCursorPos MyPoint
            mouse_event MOUSEEVENTF_RIGHTDOWN, MyPoint.x, MyPoint.y, 0, 0
        End If
        RaiseEvent MouseDown(Button, Shift, x, y)
    End Sub
      

  4.   

    TO:yunyu97() 
    哈哈,真是多谢老兄,原来是这个小问题,又可以不用子类消息.真是又简单又可行.TO: qyii(向范敬宜同志学习!) 
    呵呵,本来按钮都是很爽的呀.
      

  5.   

    简单得很,把 dblclick 事件也指向 Mousedown 事件就可以了,或者两者共同调用相同的子程序。
      

  6.   

    这样简单的问题还弄什么API。