| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1031 人关注过本帖
标题:如何让msflgxgrid控件支持鼠标滚轮呀?使用者强烈要求有滚轮功能
只看楼主 加入收藏
ggyy66
Rank: 1
等 级:新手上路
帖 子:427
专家分:0
注 册:2007-8-14
结帖率:86.25%
收藏
 问题点数:0 回复次数:7 
如何让msflgxgrid控件支持鼠标滚轮呀?使用者强烈要求有滚轮功能
如何让msflgxgrid控件支持鼠标滚轮呀?使用者强烈要求有滚轮功能
--------------
我开发的分司用的程序,表格控件用的都是msflexgrid,但是这个控件本身没有支持鼠标滚轮的功能.
如何增加这个功能呢?谢谢大家.

搜索更多相关主题的帖子: 鼠标 滚轮 控件 msflgxgrid 使用者 
2007-08-28 22:17
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 

lsghLMWR.zip (2.62 KB) 如何让msflgxgrid控件支持鼠标滚轮呀?使用者强烈要求有滚轮功能



我的msn: myfend@
2007-08-28 22:51
slore
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1108
专家分:0
注 册:2005-7-1
收藏
得分:0 
HOOK,截获消息
网上随便搜索下就有……
http://topic.csdn.net/t/20060704/18/4860292.html

不用数据的控件,你看看是否有vsflexgrid
这个貌似支持滚轮

快上课了……
2007-08-28 22:56
lisypro
Rank: 4
等 级:业余侠客
威 望:3
帖 子:695
专家分:216
注 册:2005-9-25
收藏
得分:0 
二楼下载的文件是什么呀

长期承接管理系统
代做各种vb/ / vc小程序
QQ:82341763
手机:13623290828
群号 11619730
2007-08-29 07:52
ggyy66
Rank: 1
等 级:新手上路
帖 子:427
专家分:0
注 册:2007-8-14
收藏
得分:0 
谢谢二位老师的指教。我也从网上找了两种方法,现贴上来。与大家共享。
呵呵,只要我问过的问题,只要有了答案,我一定会贴上来的。我会坚持这种作风的。

第一种方法:

如果程序里面有多个窗体,每个窗体包含多个MSFlexGrid控件,使用这种办法比单独为每个网格控件编写代码方便一些

用文本替换把“MSFlexGrid”替换为“MSHFlexGrid”就可以支持MSHFlexGrid控件了


新建一个模块,贴上下面的代码:
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public 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
Public Const GWL_WNDPROC = (-4)

Public Type tGridList
frm As Form
grid As MSFlexGrid
grdHwnd As Long
grdPreProc As Long
End Type

Private GridList() As tGridList
Private nGridCount As Long

Public Function WindowProcGridHook(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim nIndex As Long
nIndex = GetGridIndex(hwnd)
If uMsg <> 522 Then
WindowProcGridHook = CallWindowProc(GridList(nIndex).grdPreProc, hwnd, uMsg, wParam, lParam)
Else '滚轮
On Error Resume Next
With GridList(nIndex).grid
Dim lngTopRow As Long, lngBottomRow As Long
lngTopRow = 1
lngBottomRow = .Rows - 1
If wParam > 0 Then
If Not .RowIsVisible(lngTopRow) Then
.TopRow = .TopRow - 1
End If
Else
.TopRow = .TopRow + 1
End If
End With
End If
End Function

Public Sub StartHook(frm As Form)
Dim x As Variant
Dim proc As Long
For Each x In frm.Controls
If TypeOf x Is MSFlexGrid Then
nGridCount = nGridCount + 1
ReDim Preserve GridList(1 To nGridCount) As tGridList
Set GridList(nGridCount).grid = x
Set GridList(nGridCount).frm = frm
GridList(nGridCount).grdHwnd = x.hwnd
proc = SetWindowLong(x.hwnd, GWL_WNDPROC, AddressOf WindowProcGridHook)
GridList(nGridCount).grdPreProc = proc
End If
Next
End Sub


Public Sub EndHook(frm As Form)
Dim i As Long, j As Long, n As Long
For i = nGridCount To 1 Step -1
If GridList(i).frm Is frm Then
SetWindowLong GridList(i).grdHwnd, GWL_WNDPROC, GridList(i).grdPreProc
n = n + 1
For j = i To nGridCount - n
GridList(j) = GridList(j + 1)
Next
End If
Next
nGridCount = nGridCount - n
End Sub

Private Function GetGridIndex(hwnd As Long) As Long
Dim i As Long
For i = 1 To nGridCount
If GridList(i).grdHwnd = hwnd Then
GetGridIndex = i
Exit Function
End If
Next
End Function

然后在每个包含MSFlexGrid控件的窗体调用StartHook和EndHook这两个过程
例如:
Private Sub Form_Load()
StartHook Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
EndHook Me
End Sub
这样就可以支持滚轮了


2007-08-29 10:21
ggyy66
Rank: 1
等 级:新手上路
帖 子:427
专家分:0
注 册:2007-8-14
收藏(1)
得分:0 

第二种方法:

以下程序放在一个公共模块中,
在窗体中的form_load事件中 写 HookWheel me.hwnd
在窗体中的form_unload事件中 写 UnHookWheel me.hwnd
在表格的GotFocus事件中 set CtlWheel=MSFlexGrid1 '( 表格名称,根据具体情况,修改这个名称)

在表格的LostFocus事件中 set CtlWheel=Nothing'( 表格名称,根据具体情况,修改这个名称)


Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private 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

Private Const GWL_WNDPROC As Long = (-4)
Private Const WM_MOUSEWHEEL As Long = &H20A


Private m_OldWindowProc As Long

Public CtlWheel As Object

Public Sub HookWheel(ByVal frmHwnd)

m_OldWindowProc = SetWindowLong(frmHwnd, GWL_WNDPROC, AddressOf pvWindowProc)
End Sub

Public Sub UnHookWheel(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)

End Sub

Private Function pvWindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo errH

Select Case wMsg

Case WM_MOUSEWHEEL
If Not CtlWheel Is Nothing Then
If TypeOf CtlWheel Is MSFlexGrid Then
With CtlWheel

Select Case wParam
Case Is > 0

If CtlWheel.TopRow > 0 Then
CtlWheel.TopRow = CtlWheel.TopRow - 1
End If

Case Else

CtlWheel.TopRow = CtlWheel.TopRow + 1

End Select
End With
End If

End If
End Select

errH:

pvWindowProc = CallWindowProc(m_OldWindowProc, hwnd, wMsg, wParam, lParam)
End Function


2007-08-29 10:22
vb6developer
Rank: 2
等 级:论坛游民
帖 子:10
专家分:10
注 册:2021-9-27
收藏
得分:0 
回复 6楼 ggyy66
非常感谢。使用您的方法,真的让msflexgrid表格支持滚轮了!
2021-12-03 09:23
正接法
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2023-3-20
收藏
得分:0 
非常感谢你的资料,真的实现了想要的功能
非常感谢你的资料,真的实现了想要的功能
2023-04-05 10:41
快速回复:如何让msflgxgrid控件支持鼠标滚轮呀?使用者强烈要求有滚轮功能
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031167 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved