CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  控件

为什么在自定义控件中无法接收鼠标输入。

楼主GrassDragon(被蚊子咬了一下,就失眠了!)2002-09-12 02:22:45 在 VB / 控件 提问

在自定义控件中,为什么用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

相关问题

  • 如何通过鼠标获取自定义控件的控制
  • 自定义控件的鼠标消息处理~100分奉送
  • 用户自定义控件可以有输入参数吗?
  • 急!!!!!!!!!!自定义控件中如何捕获控件外的鼠标信息
  • 关于响应自定义控件的鼠标的消息问题
  • 如何在设计阶段运行自定义控件的鼠标事件?
  • 几乎已经可用了的“IP输入框”用户自定义控件
  • 自定义控件
  • 编写自定义控件
  • 自定义控件问题

关键词

  • .net
  • 鼠标
  • 代码
  • 解决
  • picture1
  • prevwndproc
  • setcapture
  • 触发
  • 捕获
  • windowproc

得分解答快速导航

  • 帖主:GrassDragon
  • zyl910
  • alpha_Ouyang

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo