¿Cómo hacer que el control dirlistbox admita la rueda del mouse en VB?
'En el módulo estándar:
Opción?Explícito
Público?Declarar?Función?CallWindowProc ?Lib ?"usuario32"? ¿"CallWindowProcA"?(ByVal?lpPrevWndFunc?As?Long, ByVal?hwnd?As?Long, ByVal?Msg?As?Long, ByVal?wParam?As?Long, ByVal?lParam?As?Long)?As?Long
¿Público?Declarar?Función?GetWindowLong?Lib?"user32"?"GetWindowLongA"?(ByVal?hwnd?As?Long,?ByVal?nIndex?As?Long)?As?Long
¿Público?Declarar?Función?SetWindowLong?Lib?"user32"?"SetWindowLongA" ?(ByVal?hwnd?As?Long, ?ByVal?nIndex?As?Long, ?ByVal?dwNewLong?As?Long)?As ?Largo
¿Público?Const?GWL_WNDPROC?=?-4amp;
¿Público?Const?WM_MOUSEWHEEL?=? amp; H20A
¿Público?¿Declarar?Función?GetCursorPos?Lib?"user32"?(lpPoint?As?POINTAPI)?As?Long
¿Público?¿Declarar?Función?WindowFromPoint? Lib?"Usuario32(ByVal?xPoint?As?Long,?ByVal?yPoint?As?Long)?As?Long
¿Público?Tipo?POINTAPI
x?As? Long
y?As?Long
Fin?Tipo
Público?
Público?OldWindowProc?As?Long?' la dirección del controlador de mensajes de la ventana predeterminada del sistema
Public?hwndDirListBox?As?Long?Se utiliza para guardar el identificador del control Dir1
'Función de controlador de mensajes personalizado
¿Público?Función?NewWindowProc(ByVal?hwnd?As?Long, ByVal?Msg?As?Long, ByVal?wParam?As?Long, ByVal?lParam?As?Long)?As?Long
¿Error?Reanudar?Siguiente
Si Msg?=?WM_MOUSEWHEEL?Entonces
'Obtener el identificador del objeto en la posición del mouse debajo
Atenuar ?CurPoint?As?POINTAPI,?hwndUnderCursor?As?Long
GetCursorPos?CurPoi
nt
hwndUnderCursor?=?WindowFromPoint(CurPoint.x,?CurPoint.y)
'Si el mouse está ubicado en Form1.Dir1, maneja el evento de la rueda del mouse
Si hwndUnderCursor?=?hwndDirListBox?Entonces
Si?wParam?=?-entonces desplácese hacia abajo
Form1.Dir1.ListIndex=? Dir1.ListIndex?=?Form1.Dir1.ListIndex?1
¿Fin?Si
¿Fin?Si
Else
' Llame a la función de procesamiento de mensajes de ventana predeterminada de Dir1
NewWindowProc?=?CallWindowProc(OldWindowProc,?hwnd,?Msg,?wParam,?lParam)
End?If
Función Fin?
'Agregar control DirListBox (Dir1) y control CommandButton (Command1) al formulario:
Privado?Sub?Command1_Click()
>Imprimir ?Dir1.List(Dir1.ListIndex)
End?Sub
Private?Sub?Form_Load()
'Obtener el identificador del control Dir1
hwndDirListBox?=?Dir1.hwnd
'Guardar la dirección del procedimiento de ventana predeterminado del control Dir1
OldWindowProc?=?GetWindowLong(Dir1.hwnd ,?GWL_WNDPROC)
'Asignar el controlador de mensajes del control Dir1 a la función personalizada NewWindowProc
Call?SetWindowLong(Dir1.hwnd,?GWL_WNDPROC,?AddressOf?NewWindowProc) p>
¿Fin?Sub
¿Privado?Sub?Form_Unload(Cancelar?As?Integer)
Dim?lngReturnValue?As?Long
lngReturnValue? =?SetWindowLong(hwndDirListBox ,?GWL_WNDPROC,?OldWindowProc)
¿Fin?