如何在msflexgrid中可以使用鼠标滚轮来滚动浏览数据

softwarewander 2005-12-20 10:31:14
这个问题困惑了我两天了。我把我现在写的代码贴上来,请各位高手帮小弟看一下



此段代码在 model中
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 prewndpro As Long
Public Const GWL_WNDPROC = -4
Public Const SPI_GETWHEELSCROLLLINES = 104
Public Const WM_MOUSEWHEEL = &H20A
Public WHEEL_SCROLL_LINES As Long


Public Sub changedefort(ByVal hwnd As Long) '修改消息处理过程的地址, 将消息发送给newWindowProc函数,
prewndpro = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf newWindowProc)
Call SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, WHEEL_SCROLL_LINES, 0)
If WHEEL_SCROLL_LINES > Int(mainform.MSFlexGrid1.Height / mainform.MSFlexGrid1.CellHeight) Then
WHEEL_SCROLL_LINES = Int(mainform.MSFlexGrid1.Height / mainform.MSFlexGrid1.CellHeight)
End If

End Sub

Public Sub undochangedefort(ByVal hwnd As Long) '将消息处理过程的地址复原
Dim returnvalue As Long
returnvalue = SetWindowLong(hwnd, GWL_WNDPROC, prewndpro)

End Sub

'用newWindowProc处理鼠标滚动事件
Public Function newWindowProc(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 'fwKeys指出是否有CTRL、SHIFT、鼠标键(左、中、右、附加)按下,允许复合。zDelta传递滚轮滚动的快慢,该值小于零表示滚轮向后滚动(朝用户方向),大于零表示滚轮向前滚动(朝显示器方向)
wzDelta = HIWORD(wParam)
wKeys = LOWORD(wParam)
If Sgn(wzDelta) = 1 Then '大于零,鼠标前滚
mainform.MSFlexGrid1.row = mainform.MSFlexGrid1.row - WHEEL_SCROLL_LINES
mainform.MSFlexGrid1.Refresh
Else '小于零,库表后滚
mainform.MSFlexGrid1.row = mainform.MSFlexGrid1.row + WHEEL_SCROLL_LINES
mainform.MSFlexGrid1.Refresh
End If
Case Else
newWindowProc = CallWindowProc(prewndpro, hw, uMsg, wParam, lParam)
End Select

End Function

Public Function HIWORD(ByVal LongIn As Long) As Integer
' 取出32位值的高16位
HIWORD = (LongIn And &HFFFF0000) \ &H10000
End Function

Public Function LOWORD(ByVal LongIn As Long) As Integer
' 取出32位值的低16位
LOWORD = LongIn And &HFFFF&
End Function





下面是在mainform 中的调用过程
Private Sub MSFlexGrid1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
'判断鼠标的移动范围是不是在msflexgrid中
If x > mainform.Frame1.Left And x < mainform.Frame1.Left + mainform.MSFlexGrid1.Width Then
If y > mainform.Frame1.Top And y < mainform.Frame1.Top + mainform.MSFlexGrid1.Height Then
changedefort mainform.MSFlexGrid1.hwnd
undochangedefort mainform.MSFlexGrid1.hwnd
End If
End If
End Sub

现在执行到 changedefort 后没有转到我定义的 newWindowProc函数中去执行,为什么呢,还有就是我觉得在mousemove事件中添加这段代码邮点不合适, 但是我也不知道该放在那个是里面更合适
哎! 真是困惑阿



...全文
340 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
KissApple 2006-02-23
  • 打赏
  • 举报
回复
mark
softwarewander 2005-12-21
  • 打赏
  • 举报
回复
哦对的,谢谢哈 , 按你说的作了蛮好的
wangtopcool 2005-12-20
  • 打赏
  • 举报
回复
在模块中
Public Function FlexScroll(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case wMsg
Case WM_MOUSEWHEEL
Select Case wParam
Case -7864320 '向下滚
SendKeys "{PGDN}"
Case 7864320 '向上滚
SendKeys "{PGUP}"
End Select

End Select
FlexScroll = CallWindowProc(Oldwinproc, hWnd, wMsg, wParam, lParam)
End Function

在窗体中:
Private Sub MSHFlexGrid1_GotFocus()
Oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf FlexScroll
End Sub

Private Sub MSHFlexGrid1_LostFocus()
SetWindowLong Me.hWnd, GWL_WNDPROC, Oldwinproc
End Sub

使用过很多次,好像还没发生过系统崩溃的显现...
daisy8675 2005-12-20
  • 打赏
  • 举报
回复
http://www.5ivb.net/Down/6/daima20056252201421/

你自己下这个吧

不过我试过无数种办法,没有一个不让系统崩溃的-_-#
所以后来干脆放弃了msflexgrid
softwarewander 2005-12-20
  • 打赏
  • 举报
回复
wangtopcool兄
你所说的那种方法我试了一下, 消息总是被FlexScroll截获, 不知怎么搞的交不出去, 造成程序在此函数中死循环的情况阿。
yinweihong 2005-12-20
  • 打赏
  • 举报
回复
试这个http://blog.csdn.net/yinweihong/archive/2004/09/25/116638.aspx

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧