CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  控件

如何让常见控件支持滚轮鼠标?

楼主shaxue(沙雪)2002-04-15 17:44:09 在 VB / 控件 提问

windows   2000   sever+vb6.0,我发现一些重要的控件不支持滚轮,比如datagrid,就不行?不知道那位大虾由此方面的资料?  
  ================================================================  
   
  CSDN   论坛助手   Ver   1.0   B0402提供下载。   改进了很多,功能完备!  
   
  ★     浏览帖子速度极快![建议系统使用ie5.5以上]。   ★     多种帖子实现界面。    
  ★     保存帖子到本地[html格式]★     监视您关注帖子的回复更新。  
  ★     可以直接发贴、回复帖子★     采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!    
  ★     支持在线检测程序升级情况,可及时获得程序更新的信息。  
   
  ★★   签名     ●      
            可以在您的每个帖子的后面自动加上一个自己设计的签名哟。  
   
  Http://www.ChinaOK.net/csdn/csdn.zip  
  Http://www.ChinaOK.net/csdn/csdn.rar  
  Http://www.ChinaOK.net/csdn/csdn.exe         [自解压]  
   
  问题点数:20、回复次数:2Top

1 楼sunnycai(飞鸟)回复于 2002-04-15 18:09:20 得分 20

----   如何让VB应用程序支持鼠标滚轮?MSDN上有一篇解决VB下应用Intellimouse鼠标的文章,它解决这一问题的方法是通过一个几十K的第三方控件实现的,可惜该控件没有源代码。况且为了支持鼠标滚轮使用一个第三方控件,好像有点得不偿失。本文给出用纯VB实现这一功能的方法。    
   
  ----   二、解决问题    
   
  ----   我们知道VB应用程序响应的Windows传来的消息,需要通过VB解释。可是很不幸,虽然VB解释所有得消息,却只让用户程序在事件中处理部分消息,VB自己处理其他的消息,或者忽略这些消息。    
   
  ----   在VB5.0以前应用程序无法越过VB直接处理消息,微软从VB5.0开始提供AddressOf   运算符,该运算符可以让用户程序将函数或者过程的地址传递给一个API函数。这样我们就可以在VB应用程序中编写自己的窗口处理函数,通过AddressOf   运算符将在VB中定义的窗口地址传递给窗口处理函数,从而绕过VB的解释器,自己处理消息。事实上,该方法可用于在VB中处理任何消息。    
   
  ----   实现应用程序支持鼠标滚轮的关键是,捕获鼠标滚轮的消息   MSH_MOUSEWHEEL、WM_MOUSEWHEEL。其中MSH_MOUSEWHEEL是为95准备的,需要Intellimouse驱动程序,而WM_MOUSEWHEEL是目前各版本Windows(98/NT40/2000)内置的消息。本文主要处理WM_MOUSEWHEEL消息。下面是WM_MOUSEWHEEL的语法。    
   
        WM_MOUSEWHEEL    
          fwKeys   =   LOWORD(wParam);   /*   key   flags   */    
          zDelta   =   (short)   HIWORD(wParam);    
          /*   wheel   rotation   */    
          xPos   =   (short)   LOWORD(lParam);    
          /*   horizontal   position   of   pointer   */    
          yPos   =   (short)   HIWORD(lParam);    
          /*   vertical   position   of   pointer   */    
         
  ----   其中:fwKeys指出是否有CTRL、SHIFT、鼠标键(左、中、右、附加)按下,允许复合。zDelta传递滚轮滚动的快慢,该值小于零表示滚轮向后滚动(朝用户方向),大于零表示滚轮向前滚动(朝显示器方向)。lParam指出鼠标指针相对屏幕左上的x、y轴坐标。    
  ----   滚轮按钮相当于普通的三键鼠标的中键,根据滚轮按钮的动作,Windows分别发出WM_MBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONDBLCLK消息,这些消息VB已经在鼠标事件中支持。    
  ----   三、实际应用    
   
  ----   根据上述原理,给出一个数据库应用的典型例子。    
   
  ----   1.用户界面班级和学生一对多的查询,当用户在学生网格以外滚动鼠标滚轮,班级主表前后移动;用户在网格以内滚动鼠标学生明细表垂直移动;如果在网格以内按住鼠标滚轮键并且滚动鼠标,学生明细表水平移动。    
   
  ----   2.Form1上ADO   Data   控件对象datPrimaryRS的   ConnectionString为"PROVIDER=MSDataShape;Data   PROVIDER=MSDASQL;dsn=SCHOOL;uid=;pwd=;",   RecordSelectors   属性的SQL命令文本为"SHAPE   {select   *   from   班级}   AS   ParentCMD   APPEND   ({select   *   from   学生   }   AS   ChildCMD   RELATE   班级名称   TO   班级名称)   AS   ChildCMD"。    
   
  ----   3.TextBox的DataSource均为datPrimaryRS,DataFiled如图所示。    
   
  ----   4.窗口下部的网格是DataGrid控件,名称为grdDataGrid。    
   
  ----   5.表单From1.frm的清单如下:    
   
  Private   Sub   Form_Load()    
  Set   grdDataGrid.DataSource   =   _    
  datPrimaryRS.Recordset("ChildCMD").UnderlyingValue    
  Hook   Me.hWnd    
  End   Sub    
   
  Private   Sub   Form_Unload(Cancel   As   Integer)    
          UnHook   Me.hWnd    
  End   Sub    
   
  ----   6.标准模块Module1.bas清单如下:    
  Option   Explicit    
  Public   Type   POINTL    
          x   As   Long    
          y   As   Long    
  End   Type    
  Declare   Function   CallWindowProc   _    
          Lib   "USER32"   Alias   "CallWindowProcA"   _    
                  (ByVal   lpPrevWndFunc   As   Long,   _    
                  ByVal   hWnd   As   Long,   _    
                  ByVal   Msg   As   Long,   _    
                  ByVal   wParam   As   Long,   _    
                  ByVal   lParam   As   Long)   As   Long    
   
  Declare   Function   SetWindowLong   _    
          Lib   "USER32"   Alias   "SetWindowLongA"   _    
                  (ByVal   hWnd   As   Long,   _    
                  ByVal   nIndex   As   Long,   _    
                  ByVal   dwNewLong   As   Long)   As   Long    
   
  Declare   Function   SystemParametersInfo   _    
          Lib   "USER32"   Alias   "SystemParametersInfoA"   _    
                  (ByVal   uAction   As   Long,   _    
                  ByVal   uParam   As   Long,   _    
                  lpvParam   As   Any,   _    
                  ByVal   fuWinIni   As   Long)   As   Long    
             
  Declare   Function   ScreenToClient   Lib   "USER32"   _    
  (ByVal   hWnd   As   Long,   xyPoint   As   POINTL)   As   Long    
   
  Public   Const   GWL_WNDPROC   =   -4    
  Public   Const   SPI_GETWHEELSCROLLLINES   =   104    
  Public   Const   WM_MOUSEWHEEL   =   &H20A    
  Public   WHEEL_SCROLL_LINES   As   Long    
                 
  Global   lpPrevWndProc   As   Long    
   
  Public   Sub   Hook(ByVal   hWnd   As   Long)    
  lpPrevWndProc   =   SetWindowLong(hWnd,   GWL_WNDPROC,   _    
            AddressOf   WindowProc)    
          '获取"控制面板"中的滚动行数值    
  Call   SystemParametersInfo(SPI_GETWHEELSCROLLLINES,   _    
      0,   WHEEL_SCROLL_LINES,   0)    
          If   WHEEL_SCROLL_LINES   >   Form1.grdDataGrid.VisibleRows   Then    
  WHEEL_SCROLL_LINES   =   Form1.grdDataGrid.VisibleRows    
          End   If    
  End   Sub    
   
  Public   Sub   UnHook(ByVal   hWnd   As   Long)    
  Dim   lngReturnValue   As   Long    
  lngReturnValue   =   SetWindowLong(hWnd,    
  GWL_WNDPROC,   lpPrevWndProc)    
  End   Sub    
   
  Function   WindowProc(ByVal   hw   As   Long,   _    
                  ByVal   uMsg   As   Long,   _    
                  ByVal   wParam   As   Long,   _    
                  ByVal   lParam   As   Long)   As   Long    
          Dim   pt   As   POINTL    
          Select   Case   uMsg    
                  Case   WM_MOUSEWHEEL    
                          Dim   wzDelta,   wKeys   As   Integer    
                          wzDelta   =   HIWORD(wParam)    
                          wKeys   =   LOWORD(wParam)    
                          pt.x   =   LOWORD(lParam)    
                          pt.y   =   HIWORD(lParam)    
                          '将屏幕坐标转换为Form1.窗口坐标    
                          ScreenToClient   Form1.hWnd,   pt    
                          With   Form1.grdDataGrid    
   
  '判断坐标是否在Form1.grdDataGrid窗口内    
  If   pt.x   >   .Left   /   Screen.TwipsPerPixelX   And   _    
  pt.x   <   (.Left   +   .Width)   /   Screen.TwipsPerPixelX   And   _    
  pt.y   >   .Top   /   Screen.TwipsPerPixelY   And   _    
  pt.y   <   (.Top   +   .Height)   /   Screen.TwipsPerPixelY   Then    
  '滚动明细数据库    
  If   wKeys   =   16   Then    
  '滚动键按下,水平滚动grdDataGrid    
  If   Sgn(wzDelta)   =   1   Then    
            Form1.grdDataGrid.Scroll   -1,   0    
  Else    
                                            Form1.grdDataGrid.Scroll   1,   0    
                                                  End   If    
                                          Else    
                              '垂直滚动grdDataGrid    
                                                  If   Sgn(wzDelta)   =   1   Then    
  Form1.grdDataGrid.Scroll   0,   0   -   WHEEL_SCROLL_LINES    
                                                  Else    
  Form1.grdDataGrid.Scroll   0,   WHEEL_SCROLL_LINES    
                                                  End   If    
                                          End   If    
                                  Else    
            '鼠标不在grdDataGrid区域,滚动主数据库    
                                          With   Form1.datPrimaryRS.Recordset    
                                                  If   Sgn(wzDelta)   =   1   Then    
                                                          If   .BOF   =   False   Then    
                                                                  .MovePrevious    
                                                                  If   .BOF   =   True   Then    
                                                                          .MoveFirst    
                                                                  End   If    
                                                          End   If    
                                                  Else    
                                                          If   .EOF   =   False   Then    
                                                                  .MoveNext    
                                                                  If   .EOF   =   True   Then    
                                                                          .MoveLast    
                                                                  End   If    
                                                          End   If    
                                                  End   If    
                                          End   With    
                                  End   If    
                          End   With    
                  Case   Else    
  WindowProc   =   CallWindowProc(lpPrevWndProc,   hw,   _    
                        uMsg,   wParam,   lParam)    
          End   Select    
  End   Function    
   
  Public   Function   HIWORD(LongIn   As   Long)   As   Integer    
        '   取出32位值的高16位    
        HIWORD   =   (LongIn   And   &HFFFF0000)   \   &H10000    
  End   Function    
   
  Public   Function   LOWORD(LongIn   As   Long)   As   Integer    
          '   取出32位值的低16位    
              LOWORD   =   LongIn   And   &HFFFF&    
  End   Function    
   
  ----   7.该例在未安装任何附加鼠标驱动程序的Win2000/98环境,采用联想网络鼠标/罗技银貂,VB6.0下均通过。    
  ----   需要进一步说明的是,对用户界面鼠标滚轮的操作也要遵循公共用户界面操作习惯,不要随意定义一些怪异的操作,如果你编制的应用程序支持鼠标滚轮,请看看是否符合下面这些标准。    
   
  ----   垂直滚动:当用户向后滚动轮子(朝用户方向),滚动条向下移动;向前滚动轮子(朝显示器方向),滚动条向上移动。对文档当前的选择应该不受影响,对数据库当前记录指针不变。    
   
  ----   水平滚动:如果同时有垂直滚动条,鼠标滚轮首先应控制上下滚动;当文档只有水平滚动杠时,用户向后滚动轮子,滚动条向右移动,向前滚动轮子,滚动条向左移动。对文档当前的选择应该不受影响,对数据库字段选择不受影响。    
   
  ----   滚动速度:鼠标滚轮每滚一个刻痕,对于长文档移动的行数,应符合控制面板中鼠标的定义(默认移动三行),对短文档每次滚一行,在任何情况下,决不要超过窗口显示的行数。    
   
  ----   平移:平移事实上就是滚动条的连续操作。平移一般是配合滚轮按钮的拖拽,最好提供方向指示光标。    
   
  ----   自动滚动:自动滚动通常开始于鼠标滚轮按钮单击,以后任何击键、鼠标按键或者滚动鼠标滚轮终Top

2 楼beesoft(男人简单就好)回复于 2002-04-15 18:23:16 得分 0

一般滚轮鼠标如果安装了自身驱动基本都支持滚动条!  
  如:msflexgrid等,不过很多鼠标没有驱动,我也不懂,嘻嘻Top

相关问题

  • 如何让scrollbox支持鼠标滚轮,或者有类似的控件
  • 请问如何支持滚轮鼠标,如支持在TEXTBOX中或LIST控件中的滚动!
  • 如何让Panel支持鼠标滚轮?
  • MSHFlexGrid控件如果使用鼠标滚轮。
  • 哪位有jbwheel(让JBuilder支持鼠标滚轮的东东)
  • 忽然意识到VB6sp5里面不支持鼠标滚轮?
  • JBuilder中如何支持鼠标滚轮??(急!!)
  • 如何让datagrid支持鼠标的滚轮?
  • jbuilder8终于支持行号和鼠标滚轮了,散分
  • 哪儿有下载插件使JBuilder7支持鼠标滚轮?

关键词

  • .net
  • 鼠标
  • 控件
  • 网格
  • 消息
  • 函数
  • 应用程序
  • vb
  • 学生
  • csdn

得分解答快速导航

  • 帖主:shaxue
  • sunnycai

相关链接

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

广告也精彩

反馈

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