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 !

Non, c'est le même Handle avant et après clic.
Mais ce n'est pas nouveau, je pense me souvenir que les TextBoxes ActiveX n'ont pas de Handle récupérable bien que quelque part il doit bien y en avoir un.
 
Teste toi-même.
J'ai mis des MsgBox de vérification ici:
VB:
            'ActiveX Control
            If TypeOf Control.Parent Is Worksheet Then
                Call GetCursorPos(Pt)
                hWnd = GetWindowFromPoint(Pt)
MsgBox "Avant clic hWnd = " & hWnd
                Call MouseLeftClick
                hWnd = GetWindowFromPoint(Pt)
MsgBox "Après clic hWnd = " & hWnd
                Call SetCursorPos(0, 0)
                hWnd = GetWindowFromPoint(Pt)
MsgBox "Après Cursor(0, 0) hWnd = " & hWnd
                Call WindowFromAccessibleObject(Control, hWnd)
MsgBox "WindowFromAccessibleObject hWnd = " & hWnd
 
Dernière édition:
A noter que moi je lance la procédure sur un double clic dans la textbox et pas par le mousemove :
VB:
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Call ControlScroll(Me.TextBox1)
End Sub
 
Ok, je laisse le hWnd que tu dis être le celui du Control mais derrière ça ne scrolle pas la TextBox, ça scrolle la feuille.
Ici en double-clic.
Essaie de voir si le Handle de ton point d'arrêt est celui affiché par le MsgBox.
 
Effectivement, tu as raison, on passe par Scroll_TextBox() si et seulement on scrolle dans la TextBox.
Donc il faut que je bloque la ScrollArea de la feuille jusqu'à ce qu'on sorte de la TextBox comme pour le code avec PeekMessage.
Idéalement je devrais utiliser l'évènement CursorOutOfRange de InkCollextor. Mais des tests précédents n'ont pas été conlcuants.
Je vais ré-essayer.
 
Non, je n'arrive pas à faire marcher l'évènement CursorOutOfRange.
VB:
    With IC
        .hWnd = hWnd                                    ' The InkCollector requires an 'anchor' hWnd
        .SetEventInterest ICEI_MouseWheel, True         ' This sets event that you want to listen for
        .SetEventInterest ICEI_CursorOutOfRange, True   ' This sets event that you want to listen for
        .MousePointer = IMP_Arrow                       ' If this is not set, the mouse pointer disappears
        .DynamicRendering = False                       ' I suggest turning this off
        .DefaultDrawingAttributes.Transparency = 255    ' And making the drawing fullly transparent
        .Enabled = True                                 ' This must be set last
    End With
Code:
'-----------
'Mouse Wheel
'-----------
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)
    Call Scroll(CurrentControl, Keep_ScrollLines, Delta > 0)
End Sub

'-------------------
'Cursor Out Of Range
'-------------------
Private Sub IC_CursorOutOfRange(ByVal Cursor As MSINKAUTLib.IInkCursor)
    MsgBox "OUT"
End Sub

Il ne se passe rien. A moins que je m'y prenne mal.
 
L'évènement CursorOutOfRange ne se déclenche pas.
Par contre l'évènement CursorInRange se déclenche parfaitement lorsqu'on entre dans la zone de la "Tablet".
Je pense qu'ils sont symétriques et tout devrait fonctionner.

Et je ne peux pas contrer par une surveillance de la position du curseur dans le RECT de la TextBox car cela suppose de garder la main (boucle) ou de recevoir des évènements de type WM_MOUSEMOVE du Hook.
 

Pièces jointes

Le scroll dans la textbox sans scroller la feuille semble fonctionner si on reste appuyé sur le bouton gauche de la souris en même temps qu'on actionne la molette.
 
Le fait que l'évènement CursorOutOfRange ne se déclenche pas est vraiment pénalisant !

J'ai trouvé une parade à dormir debout au Scroll de la feuille en même temps que la TextBox.
Le Scroll de la feuille intervient juste après le déclenchement de l'évènement IC_MouseWheel() et donc je l'inhibe avec un ActiveSheet.ScrollArea bloquant puis lance un Application.Ontime pour le débloquer avec un ActiveSheet.ScrollArea débloquant

Mais ce n'est pas le seul problème des TextBoxes. Je continue à tester.
 

Pièces jointes

Premier problème: la TextBox UserForm.
Si je ne scrolle pas le UserForm, le Scroll de la TextBox se prolonge même si on n'est plus sur la TextBox car elle ne réagit pas comme la ListBox ou la ComboBox qui n'envoie l'évènement IC_MouseWheel() que si le curseur est dans le Control.

Donc pour la TextBox UserForm, il faudrait que je capte son RECT pour vérifier que je suis bien dedans et sinon fermer son IC.
 
Dernière édition:
- 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