为什么在自定义控件中无法接收鼠标输入。
在自定义控件中,为什么用SetCapture无法接收鼠标输入?
请先看如下代码:
'------------------------------------------------------------------------
'In Mod
Public Const GWL_WNDPROC = (-4)
Public Const WM_NCACTIVATE = &H86
Public m_Hwnd As Long
Public m_Hook As Boolean
Private m_PrevWndProc As Long
Public Sub Hook()
If Not m_Hook Then
m_PrevWndProc = SetWindowLong(m_Hwnd, GWL_WNDPROC, AddressOf WindowProc)
m_Hook = True
End If
End Sub
Public Sub Unhook()
If m_Hook Then
Call SetWindowLong(m_Hwnd, GWL_WNDPROC, m_PrevWndProc)
m_Hook = False
End If
End Sub
Private Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_NCACTIVATE
WindowProc = CallWindowProc(m_PrevWndProc, hw, uMsg, 1, lParam)
Case Else
WindowProc = CallWindowProc(m_PrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
'In Usercontrol
'Usercontrl中有一ComboBox(Name:Combo1)、Picture(Name:Picture1)
Private Sub Combo1_DropDown()
Dim rc As RECT
Dim RetVal As Long
m_Hwnd = UserControl.ContainerHwnd
Call Hook
Picture1.Visible = True
SetCapture Picture1.hwnd
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture1.Visible = False
Call ReleaseCapture
Call Unhook
End Sub
问题出在哪儿,请高手指点!
问题点数:100、回复次数:5Top
1 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2002-09-12 06:32:37 得分 50
每一次触发到MouseMove的时候都需要用SetCapture捕获一次Top
2 楼alpha_Ouyang(oyq)回复于 2002-09-12 21:19:04 得分 50
你的问题在于:在COMBOBOX的DROPDOWN事件中调用SetCapture Picture1.hwnd,
而COMBOBOX在触发DROPDOWN事件处理后也调用SetCapture将下拉框显示出来,所以
失效了.我建议你用一个按钮而不是COMBOBOXTop
3 楼GrassDragon(被蚊子咬了一下,就失眠了!)回复于 2002-09-13 14:02:28 得分 0
我试了一下,将Combobox换成CommandButton就行了,看来alpha_Ouyang的说法是正确的,但是如果这样一来,我的控件程序的改动就大了!有其它办法吗?
zyl910(910:分儿,我来了!):您说“每一次触发到Mousemove的时候”是指什么意思,能说详细些吗?
Top
4 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2002-09-13 21:12:05 得分 0
用SetCapture捕获鼠标后
每一次移动鼠标都会触发Mousemove事件
每次触发的时候都用SetCapture捕获一次
这样安全些
只不过与这个好像无关
去看看Bardo(巴顿)的代码吧:
http://www.csdn.net/expert/topic/484/484745.xml?temp=.7730677
最好到东方论坛(http://www.easthot.net/HotForum/headpage.HTM)去问Bardo(巴顿)Top
5 楼GrassDragon(被蚊子咬了一下,就失眠了!)回复于 2002-09-14 08:29:04 得分 0
结帖了,感谢两位的帮助!
alpha_Ouyang(oyq) :
您解决了我提出的问题本身,我现在用textbox替换了Combox,代码并没有改动多少,而且效果比以前还好,控件做起来更灵活了。
zyl910(910:分儿,我来了!) :
我仔细阅读过您很多关于API的帖子,尤其是关于Window和Menu的,一并谢过!
由于用API不久,希望今后仍能得到你热情的帮助。
您的答复让我解决了关于SetCapture潜在的一个问题。
当我对代码作了如下改动时(简述):
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
SetParent Picture1.hwnd, 0
If x < 0 Or x > Picture1.Width Or y < 0 Or y > Picture1.Height Then
'user has clicked outside the Picture1,so hide it
Picture1.visible=false
Call ReleaseCapture
Call Unhook
End If
End Sub
当我先点击Picture1本身,再点Picture1外的区域,则SetCapture无效了。
我通过GetCapture发现:当点击Picture1本身,将鼠标捕获设置到了Picture1窗口。
我用了您的办法,成功解决问题。
Top




