Icône de la ressource

VBA - Scroll en Controls ActiveX & UserForm (ListBox, ComboBox, TextBox, UserForm, Frame, MultiPage) 16C

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Je pense avoir plus ou moins maîtrisé le TrackMouseEvent().
Mais ça reste du Hooking et ça plante violemment en cas d'erreur, donc c'est pas recommandable par rapport à la version du Post #97.

Tous les Controls ActiveX et UserForm sont bien gérés sauf la TextBox UserForm qui est assimilée au UserFrom. Il faudrait alors dans ce cas (je ne l'ai pas fait), comme pour les autres fichiers de Scroll par InkCollector, récupérer son RECT par un moyen détourné et tester si le curseur est dedans sur un WM_MOUSEMOVE par exemple.

On regrettera toujours l'évènement IC_CursorOutOfRange() qui, s'il n'était pas buggé et fonctionnait comme le WM_MOUSELEAVE du TrackMouseEvent(), serait la solution parfaite.

Le fichier à titre d'information.
 
Dernière édition:
Concernant le TrackMouseEvent() c'est encore plus compliqué que ça !
Il faut prévoir le passage rapide de la souris sur différents Controls.
De plus, comme pour le Hooking classique, en 64 bits, si l'éditeur VBE est ouvert ça ne fonctionne pas correctement.
Ce fichier de démonstration règle le problème du passage rapide de la souris sur différents Controls, mais n'inclut pas la fermeture par VBA de l'éditeur VBE.
 
Pour info, le Scroll du MultiPage c'est coton ! Surtout si on veut Scroller à partir de toutes les zones du MultiPage, ce que j'ai implémenté.
J'ai fini par comprendre le mécanisme selon qu'on le prend par WindowFromPoint() ou WindowFromAccessibleObject().
Des commentaires explicatifs ont été ajoutés dans la procédure de traitement du Control.

Et donc le Post #97 mis à jour !
 
Finalement ce n'est pas l'idéal de tester le TopIndex = -1 pour savoir si on est dans la DropDown zone d'une ComboBox.
Car la ComboBox peut être déployée (Not TopIndex = -1) et le curseur toujours dans la partie haute.
Alors ça marchait mais avec des allers/retours inutiles dans le code.
La méthode originale consistant à tester le ClassName du Parent est plus sûre dans ce cas.

Et donc le Post #97 (encore) mis à jour !
 
Dernière édition:
1744274459683.gif
,
Un code 100% TrackMouseEvent() (sans InkCollector et sans classe) et 100% original pour faire du Scroll.
Alors certes c'est du Hooking, mais très circonscrit au Control grâce aux évènements WM_MOUSELEAVE et WM_NCDESTROY.

Au total 3 méthodes:
- le Hook original de la ressource
- le InkCollector du Post #97
- le TrackMouseEvent() de ce Post.
Personne ne pourra plus se plaindre de ne pas pouvoir scroller les Controls !

Fichier modifié le 11/04/2025 à 17h36 pour vérifier la fermeture de la fenêtre VBE à chaque changement de Control.
 

Pièces jointes

Dernière édition:
Bonjour
méthode inkCollector
l'event IC_CursorOutOfRange()
ne peut fonctionner que sur
les frames a condition que le IC.hwnd ai le handle de la frame
les listbox a condition que le IC.hwnd ai le handle de la listbox

les multipages c'est problématique car il ont 2 handle handle control et handle de la page
il est évident que pour la combobox c'est le même problème plus compliqué encore puisque le handle child change a chaque développement

d'autre part le le ic.hwnd doit être syncro avec le control qui a le focus
c'est pour cela que dans ma version j'utilise l api setfocus (homologue du control) car oui ce n'est pas la même chose
en effet si on donne le focus a un handle il faut donner le focus au control car contrairement a ce que l'on ^pourrait croire
par exemple listbox1.setfocus ne donne pas le focus au Ic.hwnd ( qui est sensé ête ni plus ni moins que le handle de la listbox )et donc le scroll peut être inactif
ce phénomène et plus présent en 64 qu'en 32
pour le textbox le hwnd attribué au IC est celui du client area de l'userform et non l'userform

autrement dit en terme de handle (je precise ) le handle a prendre en compte doit être le parent direct ou de même niveau ou celui du control

pour que cela soit volatile(jump control to control) dans la setupmousewheel je détruit le ic ,le handle focused,activecontrol avant de recommencer la prise en charge du nouveau control survolé

il semble cependant que la librairie inkObj.dll ai des fonctionnement un peu différents entre les versions 32/64
à observer

pour tout vous dire chez moi 2013 pro 32 bits j'arrive a faire fonctionner tout les control scrollables avec seulement le handle du client area de l'userform
à condition de l'avoir focused avant

pour la sortie j'utilise ma fonction perso issue du calendar que j'ai modifiée encore hier et aujourdhui en y ajoutant les scroltop et scrollleft des parent dans la remonté
mais on peut tout aussi bien une fois que le handle est determiné dans la setupmousewheel faire un getwindowrect

et comme je le fait dans ma version
VB:
Private Sub IC_MouseWheel(ByVal Button As MSINKAUTLib.InkMouseButton, ByVal Shift As MSINKAUTLib.InkShiftKeyModifierFlags, ByVal Delta As Long, ByVal x As Long, ByVal y As Long, Cancel As Boolean)
    Dim ctrl As Control, avail
    Set ctrl = ActualControl
    avail = x > ArX(1) And x < ArX(3) And y > ArX(2) And y < ArX(4)
    On Error Resume Next
    If Not avail Then' si on est pas dans le rectangle on ne va pas plus loin on detruit tout
        Set IC = Nothing: Set ActualControl = Nothing: HandleCible = 0
    End If
    Select Case TypeName(ActualControl)
et oui c'est une chance le X et Y integer de l'event du IC renvoient une position screen et non control comme les control du userform

cela etant dit pour moi la solution InkCollector ca reste la méthode la plus silencieuse
et l'encéphalo dans la gestion des taches /gestion de performance est carrément plat ce qui n'est pas le cas avec tout autres méthodes confondues qui malgré des gestions d'erreurs dans les méthodes(hooking,ou do/loop doevent peekmessage) empile les erreurs dans le stack
et même apres fermeture de gestion d'erreur (goto 0) sur l'ancephalo on voit bien que c'est pas le cas
 
Dernière édition:
pour info
chez moi le fichier post 141 bloque tout je ne peux plus rien faire
je suis obligé de le fermer par la barre des taches
je n'ai même pas pu aller dans le vbe
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour