IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Vos contributions VB6 Discussion :

Récupérer les événements de la molette de la souris [Sources]


Sujet :

Vos contributions VB6

  1. #1
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut Récupérer les événements de la molette de la souris
    Et encore un de plus, décidément , je suis en forme aujourd'hui

    Ce composant à placer sur une form, recupére les evenements déclenchés par la molette de la souris.

    Sont fournis : le controle ayant de focus au momment du mouvement de la molette, le sens du mouvement, les coordonées de la souris

    Voici un exemple de code sur l'evénement déclenché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Wheel1_WheelRotate(ctrl As Object, Delta As Long, X As Long, Y As Long)
      Dim CtrlIndex as string
      Dim CtrlName as string
      On Error Resume Next
      CtrlIndex = Cstr(Ctrl.Index)
      On Error goto 0
      If CtrlIndex="" Then
        CtrlName = ctrl.Name
      Else
        CtrlName = ctrl.Name & "(" & Ctrlindex & ")"
      End If
      Debug.Print CtrlName, Delta, X, Y
    End Sub
    Note : seuls les événements ayant une propriété hWnd peuvent déclencher un événement, donc pour les labels, rien à faire.


    OCX DiMouseWheel6.zip
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut


    bon il va falloir que je me réveille une mise à jour de la page sources VB devient de plus en plus nécessaire !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 730
    Points : 876
    Points
    876
    Par défaut
    Formidable !

    je l'ai juste adapté à ma Flexgrid (en jouant avec la propriété .TopRow) et hop, ma grille défile à la roulette dans les deux sens ! Du pain béni !

    Merci ! Merci ! Merci !

    ps : petite coquille à corriger sur le ligne If CtrIndex="" Then (C'est CtrlIndex)

    Edit : Voilà, adaptée à un MsFlexGrid nommé Grid1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Private Sub Wheel1_WheelRotate(ctrl As Object, Delta As Long, X As Long, Y As Long)
        Dim CtrlIndex As String
        Dim CtrlName As String
        '
        On Error Resume Next
        '
        CtrlIndex = CStr(ctrl.Index)
        '
        On Error GoTo 0
        '
        If CtrlIndex = "" Then
            CtrlName = ctrl.Name
        Else
            CtrlName = ctrl.Name & "(" & CtrlIndex & ")"
        End If
        '
        If ctrl.Name = "Grid1" Then
            '
            If Delta > 0 Then
                If ctrl.TopRow < ctrl.Rows Then
                    ctrl.TopRow = ctrl.TopRow + 1
                End If
            Else
                If ctrl.TopRow > 0 Then
                    ctrl.TopRow = ctrl.TopRow - 1
                End If
            End If
            '
        End If
        '
        Debug.Print CtrlName, Delta, X, Y
        '
    End Sub

  4. #4
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Coquille corrigée

    Tu n' as pas besoin de toutes les lignes que j'avais mis en exemple, tu peux simplifier en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Wheel1_WheelRotate(ctrl As Object, Delta As Long, X As Long, Y As Long)
        If ctrl.Name = "Grid1" Then
            '
            If Delta > 0 Then
                If ctrl.TopRow < ctrl.Rows Then
                    ctrl.TopRow = ctrl.TopRow + 1
                End If
            Else
                If ctrl.TopRow > 0 Then
                    ctrl.TopRow = ctrl.TopRow - 1
                End If
            End If
            '
        End If
    End Sub
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonsoir,
    J'ai télécharger le zip, mais j'ai constaté qu'il ne fonctionne pas sous Vista, comme beaucoup d'autres OCX d'ailleurs, (j'en sais quelques choses).
    Heureusement j'ai encore mon portable en XP, j'ai donc pu tester que c'est bien à cause de Vista.
    Exemple: dans un OCX qui comportait un PictureBox avec un BMP et bien le BMP n'a pas suivi, ce n'était pas grave mais j'ai du remettre le BMP dans la PictureBox sous Vista et cela a fonctionné.
    A titre de renseignement je te met le Log qui a été "pondu" sous vista.
    Ligne 46: La classe DiFtpCli6.FtpCli du contrôle FtpCli1 n'est pas une classe de contrôle chargée.
    Ligne 49: Le nom de la propriété _extentx dans FtpCli1 est incorrect.
    Ligne 50: Le nom de la propriété _extenty dans FtpCli1 est incorrect.
    Ligne 51: Le nom de la propriété remotehost dans FtpCli1 est incorrect.
    Ligne 52: Le nom de la propriété username dans FtpCli1 est incorrect.
    Ligne 53: Le nom de la propriété password dans FtpCli1 est incorrect.

    J'ai bien l'impression que Vista nous réserve encore bien des surprises.
    Cordialement.

    PS: je n'ai pas encore examiné le code, je trouve juste, au premier abord que le déplacement est lent, mais peut-être qu'il y a moyen d'accélerer, j'examinerai cela un peu plus tard.

  6. #6
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    Merçi pour cet OCX

    Juste une petite remarque, dans le cas d'une flexgrid avec des lignes fixes, ça plante, il faut tenir compte de la propriété FixedRows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Wheel1_WheelRotate(ctrl As Object, Delta As Long, X As Long, Y As Long)
        If ctrl.Name = "Grid1" Then
            '
            If Delta > 0 Then
                If ctrl.TopRow < ctrl.Rows - ctrl.FixedRows Then
                    ctrl.TopRow = ctrl.TopRow + 1
                End If
            Else
                If ctrl.TopRow > ctrl[B].FixedRows Then
                    ctrl.TopRow = ctrl.TopRow - 1
                End If
            End If
            '
        End If
    End Sub

  7. #7
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    Merci pour la source Delbeke

    Je suis curieux de savoir en quoi est codé DiMouseWheel6.ocx (je pense que c'est du C, vous me corrigez sinon ), le principe de son fonctionnement (hook ? :je l'ai dis et je ne connais pas très bien que celà veux dire ...)..

    Je vais étudier cette année un "peu" de programmation système ce qui explique ma curiosité

    Merci d'avance..

  8. #8
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Citation Envoyé par Chatbour Voir le message
    Merci pour la source Delbeke

    Je suis curieux de savoir en quoi est codé DiMouseWheel6.ocx (je pense que c'est du C, vous me corrigez sinon ), le principe de son fonctionnement (hook ? :je l'ai dis et je ne connais pas très bien que celà veux dire ...)..

    Je vais étudier cette année un "peu" de programmation système ce qui explique ma curiosité

    Merci d'avance..
    Le source du composant est fourni (DiMouseWheel6.vbp). C'est du vb6
    Pour le principe, on utilise le sous-classement de la fenetre qui le contient. C'est la fonction hookwindow qui s'en charge. Comme le composant peut être utilisé par plusieurs fenetres simulanément, ma fonction gére un tableau de tous les fenetres sous-classées. En effet, un module , et ses variables , est commun à toutes les occurences du composant.
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  9. #9
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    Merci Delbeke

  10. #10
    Membre régulier Avatar de fmh1982
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 93
    Points
    93
    Par défaut
    bonjour,
    on peut le faire fonctionner avec une feuille MDI ?
    j'ai essayé mais ça ne marche pas par contre avec les contrôles ça fonctionne très bien.

    Merci

  11. #11
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    En l'etat actuel, il ne marche pas avec les feuille MDI.
    Les feuilles MDI sont composées de deux fenêtres ayant chacune leur handle.(l'une contenant l'autre, ce qui permet l'affichage des scroll-bars) et manque de chance, celle qui recoit les evénements de fenetre n'est pas celle qui est pointée par la propriété hWnd.

    Il faudrait modifier le composant, au quel cas , il ne fonctionnerait plus pour les fenetres ordinaires.

    Je ne vois d'ailleurs pas trop l'intéret de la molette de souris sur une feuille MDI.
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  12. #12
    Membre régulier Avatar de fmh1982
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 93
    Points
    93
    Par défaut
    en fait j'ai des form dans une feuille MDI ,ces forms contiennent beaucoup de contrôle, ce qui fait ,au changement de la résolution de l'écran , les scrolls de la MDI apparaissent et ce serait pratique d'utliser la molette de la souris pour scroller , mais bon j'ai pas le choix je laisse comme ça.

    sinon merci , ça m'a beaucoup aider pour d'autres contrôles

  13. #13
    Membre régulier Avatar de fmh1982
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 93
    Points
    93
    Par défaut scroll sur MDI réussi
    voila enfin j'ai réussi à faire fonctionner ton code avec la feuille MDI , en fait j'ai récupéré un code un peu méchant sur le site de MS et je l'ai mixer avec ton code et ça marche tiptop voila le code de MS à integrer dans un module :
    *** le but du code de microsoft est d'utiliser les touches du clavier pour scroller comme PageUp ou PageDown , mais en l'adaptant il fonctionne bien avec la molette de la souris.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
          (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
           lParam As Any) As Long
     
    Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
           ByVal wCmd As Long) As Long
     
    Public Const SB_BOTTOM = 7
    Public Const SB_LEFT = 6
    Public Const SB_LINEDOWN = 1
    Public Const SB_LINELEFT = 0
    Public Const SB_LINERIGHT = 1
    Public Const SB_LINEUP = 0
    Public Const SB_PAGEDOWN = 3
    Public Const SB_PAGELEFT = 2
    Public Const SB_PAGERIGHT = 3
    Public Const SB_PAGEUP = 2
    Public Const SB_RIGHT = 7
    Public Const SB_THUMBPOSITION = 4
    Public Const SB_THUMBTRACK = 5
    Public Const SB_TOP = 6
    Public Const SB_ENDSCROLL = 8
     
    Public Const WM_HSCROLL = &H114
    Public Const WM_VSCROLL = &H115
     
    Public Const GW_CHILD = 5

    voila le code final à insérer dans le MDI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Private Sub Wheel1_WheelRotate(ctrl As Object, Delta As Long, X As Long, Y As Long)
        Dim CtrlIndex As String
        Dim CtrlName As String
        '
        On Error Resume Next
        '
        CtrlIndex = CStr(ctrl.Index)
     
        If CtrlIndex = "" Then
            CtrlName = ctrl.Name
        Else
            CtrlName = ctrl.Name & "(" & CtrlIndex & ")"
        End If
        '
        If ctrl.Name = "VotreMDI" Then
            If VotreMDI.Height < 15060 Then
                If Delta > 0 Then
                    mdiclientwin = GetWindow(VotreMDI.hwnd, GW_CHILD)
                    SendMessage mdiclientwin, WM_VSCROLL, SB_LINEDOWN, ByVal 0&
     
                Else
                    mdiclientwin = GetWindow(VotreMDI.hwnd, GW_CHILD)
                    SendMessage mdiclientwin, WM_VSCROLL, SB_LINEUP, ByVal 0&
     
                End If
            Else
                Exit Sub
            End If
     
        End If
    End Sub

  14. #14
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Tu me vois ravi que tu t'en sois sorti.
    Je te félicite d'avoir pu adapter mon code à yon cas précis.
    Cependant, je ne mettrais pas cette amélioriation dans mon composant, car sous cette forme, il faudrait réécrire le composant à chaque fois que l'on developpe une application car le nom de la fenêtre mdi est en dur. Ce qui fatalement posera des problèmes quand on developpera plusieurs applis avec des nom différents pour la fenetre MDI. Hors , il ne peut y avoir qu'une seule version du composant référencée dans la base de registre. La dernière chassant la précédente.
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2009, 00h05
  2. Récupérer les évènements clavier dans une jsp
    Par cereal dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 19/10/2008, 18h45
  3. Réponses: 1
    Dernier message: 29/06/2007, 12h03
  4. Réponses: 3
    Dernier message: 05/11/2005, 23h50
  5. [JACOB] récupérer les événements d'objet COM
    Par zlavock dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 12/05/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo