当前位置:编程学习 > VB >>

datagrid控件能不能支持鼠标滚轮?

网上找到两个代码,但都不能用,不知什么原因。
最好说的详细一点。 --------------------编程问答-------------------- 不支持,但可以子类化自己处理消息…… --------------------编程问答-------------------- 能,需要使用setwindowlong 对鼠标滚轮消息进行处理 --------------------编程问答-------------------- 新建一个窗体,一个模块,窗体中放入两个textbox,Text1和Text2,在窗体中写入下面的代码
Private Sub Form_Load()
    Text1 = 0
    Text2 = 0
    'È¡µÃText1¿Ø¼þµÄ¾ä±ú
    hwndTextBox1 = Text1.hwnd
    hwndTextBox2 = Text2.hwnd
    '±£´æText1¿Ø¼þµÄĬÈÏ´°¿ÚÏûÏ¢´¦Àíº¯ÊýµØÖ·
    OldWindowProc = GetWindowLong(Text1.hwnd, GWL_WNDPROC)
    '½«Text1¿Ø¼þµÄÏûÏ¢´¦Àíº¯ÊýÖ¸¶¨Îª×Ô¶¨Ò庯ÊýNewWindowProc
    Call SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub
在模块中写入以下代码
Option Explicit
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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = -4&
Public Const WM_MOUSEWHEEL = &H20A
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Public Type POINTAPI
        x As Long
        y As Long
End Type
Public OldWindowProc As Long 'ÓÃÀ´±£´æϵͳĬÈϵĴ°¿ÚÏûÏ¢´¦Àíº¯ÊýµÄµØÖ·
Public hwndTextBox1 As Long  'ÓÃÀ´±£´æText1¿Ø¼þµÄ¾ä±ú
Public hwndTextBox2 As Long  'ÓÃÀ´±£´æText2¿Ø¼þµÄ¾ä±ú
'×Ô¶¨ÒåµÄÏûÏ¢´¦Àíº¯Êý

Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    On Error Resume Next
    If Msg = WM_MOUSEWHEEL Then
        'ÏÂÃæµÃµ½Êó±êλÖô¦µÄ¶ÔÏóµÄ¾ä±ú
        Dim CurPoint As POINTAPI, hwndUnderCursor As Long
        GetCursorPos CurPoint
        hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)
        'Èç¹ûÊó±êλÓÚForm1.Text1ÄÚ²¿£¬Ôò¶ÔÊó±ê¹öÂÖʼþ½øÐд¦Àí
        If hwndUnderCursor = hwndTextBox1 Then
            If wParam = -7864320 Then 'ÏòϹö¶¯
                Form1.Text1 = CInt(Form1.Text1) - 1
            ElseIf wParam = 7864320 Then 'ÏòÉϹö¶¯
                Form1.Text1 = CInt(Form1.Text1) + 1
            End If
        ElseIf hwndUnderCursor = hwndTextBox2 Then
            If wParam = -7864320 Then 'ÏòϹö¶¯
                Form1.Text2 = CInt(Form1.Text2) - 1
            ElseIf wParam = 7864320 Then 'ÏòÉϹö¶¯
                Form1.Text2 = CInt(Form1.Text2) + 1
            End If
        End If
    Else
        'µ÷ÓÃText1µÄĬÈÏ´°¿ÚÏûÏ¢´¦Àíº¯Êý
        NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
    End If
End Function

运行时把鼠标放在两个textbox中,然后滚动鼠标滚轮,看看效果。
PS:模块中的代码不能放在窗体里 --------------------编程问答-------------------- 本质上就是使用子类化拦截鼠标滚轮消息,然后自己模拟成向上与向下按键.

如果无效,除非是你代码没弄对,不然就是有安全软件阻止了,比如360.
补充:VB ,  控件
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,