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下均通过。
需要进一步说明的是,对用户界面鼠标滚轮的操作也要遵循公共用户界面操作习惯,不要随意定义一些怪异的操作,如果你编制的应用程序支持鼠标滚轮,请看看是否符合下面这些标准。
垂直滚动:当用户向后滚动轮子(朝用户方向),滚动条向下移动;向前滚动轮子(朝显示器方向),滚动条向上移动。对文档当前的选择应该不受影响,对数据库当前记录指针不变。
水平滚动:如果同时有垂直滚动条,鼠标滚轮首先应控制上下滚动;当文档只有水平滚动杠时,用户向后滚动轮子,滚动条向右移动,向前滚动轮子,滚动条向左移动。对文档当前的选择应该不受影响,对数据库字段选择不受影响。
滚动速度:鼠标滚轮每滚一个刻痕,对于长文档移动的行数,应符合控制面板中鼠标的定义(默认移动三行),对短文档每次滚一行,在任何情况下,决不要超过窗口显示的行数。
平移:平移事实上就是滚动条的连续操作。平移一般是配合滚轮按钮的拖拽,最好提供方向指示光标。
自动滚动:自动滚动通常开始于鼠标滚轮按钮单击,以后任何击键、鼠标按键或者滚动鼠标滚轮终止。滚动方向和速度取决于鼠标偏移滚轮按钮单击时原始位置的方向和距离,距原始位置标记越远自动滚动越快,距离近则慢。应用程序需要提供初始位置位图以及方向指示图标。
缩放:在按住 Ctrl 键的同时前后滚动滚轮。向后滚动轮子(朝用户方向),缩小比例;向前滚动轮子(朝显示器方向),增大比例。
四、结束语
通过前面的介绍,你会发现编制"直接"支持鼠标滚轮软件,需要增加不少工作量。但对软件的易用性有显著的提高,笔者认为这一点付出是值得的。当然你也可以通过使用专门的鼠标功能增强软件来实现部分鼠标滚轮功能。最后需要注意的是,并不是每个用户都有滚轮鼠标,软件的鼠标滚轮上功能,要让用户通过其他的操作也可以实现。
|
|