XL 2019 Molette Scroll sur ListBox

gg13

XLDnaute Occasionnel
Bonjour,

Je commence un nouveau projet pour lequel je devrai utiliser des ListBox et ComboBox.
Ces listes seront longues et je voudrais utiliser le scroll de la molette plutôt que les ascenseurs.

Après renseignement sur le site j’ai voulu utiliser ce post :
Mouse Wheel Hook (faire défiler le contenu d'une combobox/listbox avec la roulette)

Je galère depuis 2 jours et malgré plusieurs essais je n’arrive pas à intégrer ces différentes macros, plusieurs messages d’erreurs ….
Je ne comprends pas tout.
Si vous pouvez m’aider un peu je vous remercie d’avance.

Je joins le fichier exemple avec les listBox .

GG13
 

Pièces jointes

  • NBA1.3.xlsm
    37.6 KB · Affichages: 11

patricktoulon

XLDnaute Barbatruc
Bonjour lionel
vous l'aurez dans les ressources quand ça sera dispos
j'attend une idée lumineuse de @Dudu2 au cas ou il aurait une autre méthode plus séduisante pour le ré enroulement de combo
vous pouvez me dire si ces déclaration sont bonne en 64
VB:
 Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As Long
    Private Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As Long
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPtr
 

Dudu2

XLDnaute Barbatruc
Salut les Scroll accros,
J'ai une solution qui fonctionne à 99%.
Le 1% qui me manque et que je cherche en ce moment c'est la détermination du RECT de la DropDown Window d'une ComboBox dans un Frame d'un UserForm.
Je récupère le RECT du Frame et je rame pour trouver celui de la DropDown de la ComboBox.
 

Usine à gaz

XLDnaute Barbatruc
Bonjour lionel
vous l'aurez dans les ressources quand ça sera dispos
j'attend une idée lumineuse de @Dudu2 au cas ou il aurait une autre méthode plus séduisante pour le ré enroulement de combo
vous pouvez me dire si ces déclaration sont bonne en 64
VB:
 Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As Long
    Private Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As Long
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPtr
 

Pièces jointes

  • euh2.gif
    euh2.gif
    134.7 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
re

@Dudu2
c'est la détermination du RECT de la DropDown Window d'une ComboBox dans un Frame d'un UserForm.
ben c'est le même procédé
VB:
dim pos as POINTAPI , handlecontrolChild&  , RectGle as rect

getcursorpos pos

handlecontrolChild=windowfrompoint(pos.x , pos.y+(combobox1.height*pointtopixel))
getwindowrect(handlecontrolchild,rectgle)
'on inclu la combo elle meme dans le rect 
rectgle.top=rectgle.top-(combobox1.height*pointtopixel)
msgbox rectgle.left'........
terminé tu as ton rectangle de la child incluant la combo aussi
 

Dudu2

XLDnaute Barbatruc
j'attend une idée lumineuse de @Dudu2 au cas ou il aurait une autre méthode plus séduisante pour le ré enroulement de combo
Quand je traitais sur le Click, j'avais géré un clic souris généré dans la Combo pour la rembobiner dès qu'on changeait de Control Hooké.

Maintenant je ne gère QUE les RECT et donc je n'ai plus besoin de rembobiner les Combos.
Elles restent ouvertes autant qu'elles le veulent comme dans le fonctionnement sans Scroll.
J'ai protégé le LowLevel d'une perte du Scroll sur le Control Hooké au cas où la Combo serait rembobinée par quelque moyen que ce soit (ESC, ...) avant d'être UnHookée.

L'intérêt de cette solution c'est que c'est ENCORE simplifié:
VB:
'------------------------------------------------------------
'Scroll Management Functions
'
'The Scroll is managed through:
'- 1 single event ComboBox_MouseMove() or ListBox_MouseMove()
'- 1 single function ControlScroll()
'------------------------------------------------------------

Perso je prends pas la Combo dans le Scroll, je n'y garde que la zone DropDown qui est celle qui contient l'ascenseur du Scroll.

Je passe le fichier actuel, je cherche toujours une solution pour ma Combo en Frame mais c'est assez mineur en fait. Je finirai par trouver mais c'est pas évident.
 

Pièces jointes

  • VBA Scroll Souris en ListBox et ComboBox - Sauf Combo Frame.xlsm
    75.4 KB · Affichages: 5
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Bjr Dudu2 :)
Dans ta version 27431lol , La mollette ne fonctionne pas chez moi sur :
1667052165734.png

Combox1 et 2
:)
 

patricktoulon

XLDnaute Barbatruc
@Dudu2
je ne peux pas mieux faire pour te montrer comment je fait pour chopper les handle combo et handle combo child et même le rectangle
c'est simplissime au plus haut point
et comme je de disais une ou deux pages en arrière le handle change a chaque développer
et oui j'utilise le mousemove pourtant le handle child, je l'ai bien que au dropclick même si je n'utilise pas cet event
tu comprendra peut être pourquoi j'utilise le mouseup maintenant
demo.gif
 

Pièces jointes

  • exemple pour Dudu2 handledropzonewindow +rectangle.xlsm
    25.1 KB · Affichages: 3

Dudu2

XLDnaute Barbatruc
Voilà, retour...
@patricktoulon, je comprends bien ce que tu fais, mais chercher la fenêtre qu'il y a juste en dessous c'est pas très "carré". Il pourrait très bien y avoir un autre Control défini juste en dessous. C'est assez théorique je le reconnais, mais c'est une possibilité. Et tu considèrerais que c'est tout le temps en DropDown.
Si je ne trouve rien j'utiliserai cette méthode.

Par contre je ne comprends pas pourquoi en 365 ma méthode ne fonctionne pas au moins pour la Combo directe en UserForm. Faut croire que l'empilement des Handle de Windows est différent de 2016.
Ça montre qu'il faut que je trouve autre chose pour couvrir tous les cas, fut-ce la méthode à @patricktoulon.
 

patricktoulon

XLDnaute Barbatruc
Il pourrait très bien y avoir un autre Control défini juste en dessous. C'est assez théorique je le reconnais, mais c'est une possibilité. Et tu considèrerais que t'est tout le temps en DropDown.
Si je ne trouve rien j'utiliserai cette méthode.
et oui je comprend mieux pourquoi tu n'adhère pas tout de suite
c'est par ce que tu ne sais pas tout

alors à savoir!!!:
le Combobox a un comportement bien particulier au niveau du handing Main
si bien que des qu'il prends le focus en cliquant sur sur le drop button
au mouseUp(
elle a donc le focus) elle te donnera
  1. soit le handle de la child si il est développé
  2. soit le handle de la combobox si elle n'est pas developpéeet cela meme si juste endessous on met une frame ou une combo ou mlistbox juste en dessous
et cela sans exception a chaque fois

alors oui je sais ce n'est pas logique mais pourtant c'est bien le cas
je te fait une démo si tu veux
 
Dernière édition:

Statistiques des forums

Discussions
315 093
Messages
2 116 136
Membres
112 667
dernier inscrit
foyoman