Integration automatique de la roulette/molette de la souris dans vos applis

Description

'je dois de dire un merci aux personnes ci-dessous:
'Daetips pour sa source http://www.vbfrance.com/codes/MOUSE-WHEEL-EVENTS-EVENEMENTS-MIDDLE_MOUSE_DOWN-MIDDLE_MOUSE_UP-MIDDLE_MOUSE_DOUBLE_CLICK-DLL_32546.aspx
'Philippe734 qui est ma reference vbfrance sur le sujet avec sa source de reference http://www.vbfrance.com/codes/UTILISATION-MOLETTE-ROULETTE-SOURIS_25201.aspx
'EBArtSoft et sa source http://www.vbfrance.com/codes/UTILISER-ROULETTE-DANS-VB6-IDE-ADDIN_21802.aspx

'Ca fait 2 Jours depuis le 11/2 que je me plonge pour la premiere fois dans le subclassing dont j'ai toujours entendu parler dans ce forum et reservé aux initiés
'Au début je voulais juste faire marcher la molette dans mes datagrid et hop voila je me suis retrouve dans un monde magique dont je me demande encore comment j'ai pu m'en passer.
Le problème en lui même est déjà connu et a eu des solutions diverses interessantes pour la plupart mais mon approche est originale, intuitive et simple comme dab.

'Le concept de cet OCX est 100% de moi, et il offre un niveau de souplesse un petit poil au dessus sur la source géniale de Daetips
'Il est autonome et n'a pas besoin d'utiliser le génial fichier Wheel.tlb d'EBArtSoft
'Pas besoin de charger quoi que ce soit du registre, le pas de la roulette est un propriété du contrôle.

'Il suffit de déposer ce contrôle ds votre form et hop les evenements de la molette sont a votre portée.

Note très importante:
--------------------
Il est important de préciser que le but premier de ce controle est d'intercepter tous les mouvements de la molette et de le renvoyer au Hwnd demandeur. La source de Daetips va essayer de traiter le scroll sur les Hwnd demandeurs, ce qui n'est pas le but que je recherche. Pourquoi? parce que je voudrais pouvoir faire interagir la molette sur un objet datagrid (par exemple) en decidant sur quel conteneur je voudrais intercepter les actions de la molette. les cas de figures sont tellement variés que j'ai besoin de traiter les actions de la molette par moi-même, exemple comment je veux que ce comporte la molette pour 2 datagrids dans un même conteneur.
Il existe aussi un autre cas de figure (Le cas pour lequel j'ai été amené absolument à me pencher sur ce problème, vu que c'est le point central de l'affichage de mes listes dans toutes mes applis), ou ce composant se trouve sur un Usercontrol en meme temps qu'un datagrid. je voudrais intercepter les mouvements de la roulette sur le Form Conteneur de cet Usercontrol et j'ai besoin de dire à l'objet sur quel Hwnd je veux qu'il intercepte les mouvements de la molette, en plus les imbrications de usercontrol peuvent ordre à plus de 2 niveaux.

Le controle intercepte les mouvements de la roulette sur le form demandeur, mais va neanmoins préciser si l'action est contenu dans la fenetre. On pourra de ce fait décider de le traiter ou pas. En plus on peut demander a l'objet de stopper la capture de la molette dur le demandeur lorsque le focus est hors de la fenetre.
L'exemple ci-dessous illustre une gestion de ce controle.

Source / Exemple :


Option Explicit
Private moRst As ADODB.Recordset

Private Sub Command1_Click()
    FormB.Show
End Sub

Private Sub SNA_Wheel1_WheelAction(ByVal peWheelAction As Prj_SNAWheel.EnumWheelAction, ByVal plScrollLines As Variant, ByVal pbFocusIn As Boolean, pbWheelOff As Boolean)
    If pbFocusIn Then
        Select Case peWheelAction
            Case wa_WheelDown:
            Case wa_WheelUP:
            Case wa_WheelDoubleClick:
            Case wa_WheelMove: If pbFocusIn Then DataGrid1.Scroll 0, plScrollLines
        End Select
    Else
        'Je detecte une action de la molette hors de la fenetre, je demande d'y arreter la capture
        pbWheelOff = True
        Debug.Print "WheelOff on Datagrid"
    End If
End Sub

Private Sub Form_Activate()
    'Je suis activé, alors je fais la demande de capture de la molette
    With SNA_Wheel1
        .hWnd = Me.hWnd
        Debug.Print "Activate DataGrid"
    End With
End Sub

Private Sub Form_Load()
    Set DataGrid1.DataSource = moRst
End Sub

Private Sub Form_Initialize()
    Set moRst = New ADODB.Recordset
    With moRst
        .CursorLocation = adUseClient
        .Open "Select * From [Feuil1$]", _
            "driver={Microsoft Excel Driver (*.xls)};DriverId=790;ReadOnly=0;FirstRowHasNames=1;DBQ=" & App.Path & "\Classeur1.xls", _
            adOpenStatic, _
            adLockReadOnly
    End With
End Sub

Private Sub Form_Terminate()
    If moRst.State = adStateOpen Then moRst.Close
    Set moRst = Nothing
End Sub

Conclusion :


Je suis tenté de dire qu'il n'existe pas de bug. En effet le developpeur a tous les moyens d'orienter la capture de la molette sur l'objet de son choix.

Laissons voir les tests, retournez moi les erreurs.

A+

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.