begin process at 2012 02 13 23:18:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Périphériques

 > UTILISATION MOLETTE ROULETTE SOURIS

UTILISATION MOLETTE ROULETTE SOURIS


 Information sur la source

Note :
9,33 / 10 - par 6 personnes
9,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Périphériques Niveau :Initié Date de création :05/08/2004 Date de mise à jour :06/08/2004 14:12:48 Vu / téléchargé :17 535 / 1 926

Auteur : Philippe734

Ecrire un message privé
Site perso
Commentaire sur cette source (42)
Ajouter un commentaire et/ou une note

 Description

Prise en charge de la molette d'une souris pour une grille. Modification d'une source de EBArtSoft@ Mettez le code dans un module, et appelez la fonction suivante : ActiverMoletteEtDéfinirObjetScroll en mettant l'objet auquel l'action de la molette sera attaché. J'ai un peu modifié la source de EBArtSoft@, merci à lui :-)
http://www.vbfrance.com/code.aspx?ID=21802
v ous devez référencer le fichier Wheel.tlb d'EBArtSoft@ dans le zip, sinon si vous déclarez les api ca ne fonctionnera pas, vb6 plantera (j'ai essayé ; EBArtSoft@ doit sans doute savoir pkoi :-) le fichier wheel.tlb contient des api, mais en mieux peut etre lol
fonctionne pour un datagrid, msflexgrid, mshflexgrid ; le reste j'ai pas testé.

Par exemple vous voulez l'attacher à un datagrid nommé datagrid1 dans une form nommé frmMain, alors faites :

    Call ActiverMoletteEtDéfinirObjetScroll(frmMain.DataGri d1)

Source

  • Option Explicit
  • '
  • ' Original Idea From
  • ' :) Ulli's VBMouseWheel (10.09.2002)
  • ' then
  • ' codé par EBArtSoft@ (2004) : VB6 Wheel AddIn : ebartsoft@hotmail.com
  • ' pour activer la molette dans l'éditeur de VB6, y avait un copyright
  • ' then
  • ' modifié par philippe734 pour l'activation de la molette
  • ' d'un object ayant :
  • ' soit deux scroll bar, vertical et horizontale de type
  • ' .scroll(cols as long, rows as long) (datagrid par ex)
  • ' soit de type
  • ' .toprow as long (flexgrid par ex)
  • ' Rq : Référencer le fichier Wheel.tlb de EBArtSoft@
  • '
  • Private Const REG_SZ As Long = 1
  • Private Const GWL_WNDPROC As Long = (-4)
  • Private Const MAX_PATH As Long = 260
  • Private Const WM_KILLFOCUS As Long = &H8
  • Private Const WM_MOUSEWHEEL As Long = &H20A
  • Private Const WM_MOUSEMOVE As Long = &H200
  • Private Const HKEY_CURRENT_USER As Long = &H80000001
  • Private Const PRPNAME As String = "WheelPrc"
  • Private Const HKEYDESKTOP As String = "Control Panel\Desktop"
  • Private Const HKEYLINES As String = "WheelScrollLines"
  • Private Const HKEYSMOOTH As String = "SmoothScroll"
  • Private mSmooth As Boolean
  • Private mLines As Long
  • Private mhWnd As Long
  • Private bMoletteActive As Boolean
  • Private ObjetScroll As Object
  • Private iTypeScroll As Byte
  • Private Enum TypeScroll
  • ScrollColRow = 1
  • TopRow = 2
  • End Enum
  • Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  • '**** Procédure à appeller pour
  • Public Sub ActiverMoletteEtDéfinirObjetScroll(ByVal QuelObjetFautilScrollerDeTypeScrollVerticaleEtHorizontale As Object)
  • On Error GoTo MoletteErr
  • Call LoadSettings
  • If bMoletteActive Then
  • Call UnhookWindow
  • End If
  • Set ObjetScroll = QuelObjetFautilScrollerDeTypeScrollVerticaleEtHorizontale
  • On Error GoTo PeutEtreTopRow 'sinon on essaye une autre propriété
  • If IsError(ObjetScroll.Scroll(0, 0)) = False Then 'teste si l'objet
  • 'a une propriété .scroll(cols as long, rows as long)
  • iTypeScroll = TypeScroll.ScrollColRow
  • GoTo ProprieteOK 'si oui alors on active la molette
  • Else
  • PeutEtreTopRow:
  • On Error GoTo MoletteErr 'sinon on ne peut pas activer la molette
  • If IsError(ObjetScroll.TopRow) = False Then 'test si l'objet
  • 'a une propriété .toprow
  • iTypeScroll = TypeScroll.TopRow
  • End If 'si oui alors on active la molette
  • End If
  • ProprieteOK:
  • Call HookWindow
  • Exit Sub
  • MoletteErr:
  • MsgBox "Prise en charge de la molette impossible", vbExclamation
  • bMoletteActive = False
  • Exit Sub
  • End Sub
  • Private Sub HookWindow()
  • Dim tWnd As Long
  • 'test si la fenetre est de class ThunderFormDC
  • mhWnd = FindWindow("ThunderFormDC", vbNullString)
  • 'tWnd = FindWindowEx(mhWnd, ByVal 0&, "ThunderFormDC", vbNullString)
  • 'avec lui, il ne la trouve pas le handle de notre fenetre donc
  • 'je l'ai enlevé car j'ai due mal le faire
  • 'If tWnd = 0 Then Exit Sub '<- normalement
  • If mhWnd = 0 Then '<- donc on fait comme ca
  • 'test si la fenetre est de class ThunderRT6FormDC
  • 'form vb6 une fois compilé
  • mhWnd = FindWindow("ThunderRT6FormDC", vbNullString)
  • End If
  • If mhWnd = 0 Then
  • 'test si la fenetre est de class MDIClient
  • 'fenetre mère
  • mhWnd = FindWindow("MDIClient", vbNullString)
  • End If
  • If mhWnd = 0 Then
  • MsgBox "Prise en charge de la molette impossible", vbExclamation
  • bMoletteActive = False
  • Exit Sub
  • End If
  • SetProp mhWnd, PRPNAME, GetWindowLong(mhWnd, GWL_WNDPROC)
  • SetWindowLong mhWnd, GWL_WNDPROC, AddressOf WindowProc
  • bMoletteActive = True
  • End Sub
  • Private Sub UnhookWindow()
  • Dim mWndProc As Long
  • mWndProc = GetProp(mhWnd, PRPNAME)
  • If mWndProc = 0 Then Exit Sub
  • RemoveProp mhWnd, PRPNAME
  • SetWindowLong mhWnd, GWL_WNDPROC, mWndProc
  • Set ObjetScroll = Nothing
  • bMoletteActive = False
  • End Sub
  • Private Sub LoadSettings()
  • Dim sData As String * MAX_PATH
  • Dim hKey As Long
  • Dim lSize As Long
  • If RegOpenKey(HKEY_CURRENT_USER, HKEYDESKTOP, hKey) Then
  • mSmooth = True
  • mLines = 3
  • Else
  • lSize = MAX_PATH
  • If RegQueryValueEx(hKey, HKEYSMOOTH, 0, REG_SZ, sData, lSize) Then
  • mSmooth = True
  • Else
  • mSmooth = CBool(Left(sData, lSize))
  • End If
  • lSize = MAX_PATH
  • If RegQueryValueEx(hKey, HKEYLINES, 0, REG_SZ, sData, lSize) Then
  • mLines = 3
  • Else
  • mLines = CLng(Left(sData, lSize))
  • End If
  • RegCloseKey hKey
  • End If
  • End Sub
  • Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  • Dim mWndProc As Long
  • Dim NumLines As Long
  • Dim ScrollTo As Long
  • Dim TopLn As Long
  • mWndProc = GetProp(hwnd, PRPNAME)
  • If mWndProc = 0 Then Exit Function
  • WindowProc = CallWindowProc(mWndProc, hwnd, uMsg, wParam, lParam)
  • 'wParam indique le mouvement de la molette
  • 'pour wParam négatif, c'est pour voir en haut
  • 'positif, on descend le curseur du scrollbar
  • Select Case uMsg
  • 'Case WM_KILLFOCUS
  • ' UnhookWindow
  • ' HookWindow
  • Case WM_MOUSEWHEEL
  • WindowProc = 0
  • If ObjetScroll Is Nothing Then Exit Function
  • TopLn = 0
  • Select Case mLines
  • Case "-2": NumLines = (10 * (1 / 2))
  • '10 pour 10 lignes visibles, mais ça change pas grand chose
  • Case "-1": NumLines = (10 - 1)
  • Case Else: NumLines = Abs(mLines)
  • End Select
  • If NumLines < 1 Then NumLines = 1
  • ScrollTo = TopLn - Sgn(wParam) * NumLines / ((wParam And &HFFFF&) \ 4 + 1) 'compute new top line
  • If mSmooth Then
  • If iTypeScroll = TypeScroll.ScrollColRow Then
  • ObjetScroll.Scroll 0, ScrollTo
  • ElseIf iTypeScroll = TypeScroll.TopRow Then
  • If ObjetScroll.TopRow + ScrollTo <= 1 Then
  • ObjetScroll.TopRow = 1 'ligne min
  • ElseIf ObjetScroll.TopRow + ScrollTo >= ObjetScroll.Rows Then
  • ObjetScroll.TopRow = ObjetScroll.Rows 'ligne max
  • Else 'c'est bon, on peut scroller
  • ObjetScroll.TopRow = ObjetScroll.TopRow + ScrollTo
  • End If
  • End If
  • End If
  • End Select
  • End Function
Option Explicit
'
' Original Idea From
' :) Ulli's VBMouseWheel (10.09.2002)
' then
' codé par EBArtSoft@ (2004) : VB6 Wheel AddIn : ebartsoft@hotmail.com
' pour activer la molette dans l'éditeur de VB6, y avait un copyright
' then
' modifié par philippe734 pour l'activation de la molette
' d'un object ayant :
' soit deux scroll bar, vertical et horizontale de type
' .scroll(cols as long, rows as long) (datagrid par ex)
' soit de type
' .toprow as long (flexgrid par ex)
' Rq : Référencer le fichier Wheel.tlb de EBArtSoft@
'
Private Const REG_SZ                As Long = 1
Private Const GWL_WNDPROC           As Long = (-4)
Private Const MAX_PATH              As Long = 260
Private Const WM_KILLFOCUS          As Long = &H8
Private Const WM_MOUSEWHEEL         As Long = &H20A

Private Const WM_MOUSEMOVE          As Long = &H200

Private Const HKEY_CURRENT_USER     As Long = &H80000001
Private Const PRPNAME               As String = "WheelPrc"
Private Const HKEYDESKTOP           As String = "Control Panel\Desktop"
Private Const HKEYLINES             As String = "WheelScrollLines"
Private Const HKEYSMOOTH            As String = "SmoothScroll"

Private mSmooth     As Boolean
Private mLines      As Long
Private mhWnd       As Long

Private bMoletteActive As Boolean
Private ObjetScroll As Object
Private iTypeScroll As Byte
Private Enum TypeScroll
    ScrollColRow = 1
    TopRow = 2
End Enum

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'**** Procédure à appeller pour
Public Sub ActiverMoletteEtDéfinirObjetScroll(ByVal QuelObjetFautilScrollerDeTypeScrollVerticaleEtHorizontale As Object)
    On Error GoTo MoletteErr
    Call LoadSettings
    If bMoletteActive Then
        Call UnhookWindow
    End If
    Set ObjetScroll = QuelObjetFautilScrollerDeTypeScrollVerticaleEtHorizontale
    On Error GoTo PeutEtreTopRow    'sinon on essaye une autre propriété
    If IsError(ObjetScroll.Scroll(0, 0)) = False Then    'teste si l'objet
        'a une propriété .scroll(cols as long, rows as long)
        iTypeScroll = TypeScroll.ScrollColRow
        GoTo ProprieteOK    'si oui alors on active la molette
    Else
PeutEtreTopRow:
        On Error GoTo MoletteErr    'sinon on ne peut pas activer la molette
        If IsError(ObjetScroll.TopRow) = False Then    'test si l'objet
            'a une propriété .toprow
            iTypeScroll = TypeScroll.TopRow
        End If    'si oui alors on active la molette
    End If
ProprieteOK:
    Call HookWindow
    Exit Sub
MoletteErr:
    MsgBox "Prise en charge de la molette impossible", vbExclamation
    bMoletteActive = False
    Exit Sub
End Sub

Private Sub HookWindow()
    Dim tWnd As Long
    'test si la fenetre est de class ThunderFormDC
    mhWnd = FindWindow("ThunderFormDC", vbNullString)
    'tWnd = FindWindowEx(mhWnd, ByVal 0&, "ThunderFormDC", vbNullString)
    'avec lui, il ne la trouve pas le handle de notre fenetre donc
    'je l'ai enlevé car j'ai due mal le faire
    'If tWnd = 0 Then Exit Sub '<- normalement
    If mhWnd = 0 Then    '<- donc on fait comme ca
        'test si la fenetre est de class ThunderRT6FormDC
        'form vb6 une fois compilé
        mhWnd = FindWindow("ThunderRT6FormDC", vbNullString)
    End If
    If mhWnd = 0 Then
        'test si la fenetre est de class MDIClient
        'fenetre mère
        mhWnd = FindWindow("MDIClient", vbNullString)
    End If
    If mhWnd = 0 Then
        MsgBox "Prise en charge de la molette impossible", vbExclamation
        bMoletteActive = False
        Exit Sub
    End If
    SetProp mhWnd, PRPNAME, GetWindowLong(mhWnd, GWL_WNDPROC)
    SetWindowLong mhWnd, GWL_WNDPROC, AddressOf WindowProc
    bMoletteActive = True
End Sub

Private Sub UnhookWindow()
    Dim mWndProc  As Long
    mWndProc = GetProp(mhWnd, PRPNAME)
    If mWndProc = 0 Then Exit Sub
    RemoveProp mhWnd, PRPNAME
    SetWindowLong mhWnd, GWL_WNDPROC, mWndProc
    Set ObjetScroll = Nothing
    bMoletteActive = False
End Sub

Private Sub LoadSettings()
    Dim sData As String * MAX_PATH
    Dim hKey  As Long
    Dim lSize As Long
    If RegOpenKey(HKEY_CURRENT_USER, HKEYDESKTOP, hKey) Then
        mSmooth = True
        mLines = 3
    Else
        lSize = MAX_PATH
        If RegQueryValueEx(hKey, HKEYSMOOTH, 0, REG_SZ, sData, lSize) Then
            mSmooth = True
        Else
            mSmooth = CBool(Left(sData, lSize))
        End If
        lSize = MAX_PATH
        If RegQueryValueEx(hKey, HKEYLINES, 0, REG_SZ, sData, lSize) Then
            mLines = 3
        Else
            mLines = CLng(Left(sData, lSize))
        End If
        RegCloseKey hKey
    End If
End Sub

Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim mWndProc     As Long
    Dim NumLines     As Long
    Dim ScrollTo     As Long
    Dim TopLn        As Long
    mWndProc = GetProp(hwnd, PRPNAME)
    If mWndProc = 0 Then Exit Function
    WindowProc = CallWindowProc(mWndProc, hwnd, uMsg, wParam, lParam)
    'wParam indique le mouvement de la molette
    'pour wParam négatif, c'est pour voir en haut
    'positif, on descend le curseur du scrollbar
    Select Case uMsg
        'Case WM_KILLFOCUS
        '    UnhookWindow
        '    HookWindow
    Case WM_MOUSEWHEEL
        WindowProc = 0
        If ObjetScroll Is Nothing Then Exit Function
        TopLn = 0
        Select Case mLines
        Case "-2": NumLines = (10 * (1 / 2))
            '10 pour 10 lignes visibles, mais ça change pas grand chose
        Case "-1": NumLines = (10 - 1)
        Case Else: NumLines = Abs(mLines)
        End Select
        If NumLines < 1 Then NumLines = 1
        ScrollTo = TopLn - Sgn(wParam) * NumLines / ((wParam And &HFFFF&) \ 4 + 1)    'compute new top line
        If mSmooth Then
            If iTypeScroll = TypeScroll.ScrollColRow Then
                ObjetScroll.Scroll 0, ScrollTo
            ElseIf iTypeScroll = TypeScroll.TopRow Then
                If ObjetScroll.TopRow + ScrollTo <= 1 Then
                    ObjetScroll.TopRow = 1    'ligne min
                ElseIf ObjetScroll.TopRow + ScrollTo >= ObjetScroll.Rows Then
                    ObjetScroll.TopRow = ObjetScroll.Rows    'ligne max
                Else    'c'est bon, on peut scroller
                    ObjetScroll.TopRow = ObjetScroll.TopRow + ScrollTo
                End If
            End If
        End If
    End Select
End Function


 Conclusion

référencer le fichier wheel.tlb d'EBArtSoft@ (in the zip)

Par exemple vous voulez l'attacher à un mshflexgrid nommé mshflexgrid1 dans une form nommé frmMain, alors faites :

    Call ActiverMoletteEtDéfinirObjetScroll(frmMain.MSHFlex Grid1)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

06 août 2004 14:12:48 :
Prise en charge de deux types de grille, une .scroll(cols as long, rows as long) et une .TopRow as long

 Sources du même auteur

Source avec Zip [VBA POWERPOINT] PAGINATION AVEC TOTAL DE DIAPO
Source avec Zip [VBA POWERPOINT] CRÉER UN SOMMAIRE AUTOMATIQUE
Source avec Zip [VBA] SCROLLER UNE LISTBOX AVEC LA MOLETTE DE LA SOURIS PAR ...
Source avec Zip Source avec une capture [VB6 BASE DE DONNÉE] DÉMO SQL SUR TABLEAU EXCEL + DATAGRID A...
Source avec Zip Source avec une capture CLSWIDGET = UNE CLASS POUR FAIRE UN WIDGET AVEC INFOBULLE E...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) LIRE ET CHANGER LA LUMINOSITÉ DES ÉCRANS LCD (DE PORTABLE) C... par ShareVB
Source avec Zip Source avec une capture VISUAL BASIC ET MICROPROCESSEUR MBED par ccllee
Source avec Zip Source avec une capture Source .NET (Dotnet) VARIATEUR SECTEUR 11 VOIES SUR PORT SERIE OU USB par mays
Source avec Zip Source avec une capture PILOTER LES PORTS PARALLELES. par djebbipgm
Source avec Zip PILOTER LES PORT COMM DE PC par djebbipgm

Commentaires et avis

Commentaire de frop01 le 05/08/2004 21:30:51

Très utile Merci :)

Commentaire de sam013 le 05/08/2004 21:43:23

Ah ça c'est bien :)

Commentaire de trabice le 29/09/2004 10:25:44

merci bcp.pour cette belle source qui marche.
c tout ce kon lui demande..

Commentaire de zinoub le 08/12/2004 17:49:35

Bonjour ,
comment faites vous pour charger l'api wheel.tlb? il me semble que j'ai un petit souci de chargement

merci pour votre aide!

Commentaire de Philippe734 le 08/12/2004 22:47:41

tu l'a référencie ds le projet, un peu comme une dll

Commentaire de log2002 le 30/12/2004 12:35:32

salut à tous,

j'ai un message d'error :

"prise en charge de la molette impossible"

c'est du à quoi ?

merci

Commentaire de tibi055 le 01/04/2005 11:01:23

cool mais fonctionne pas si le contrôle est dans une fenêtre de type MDI Child.

Commentaire de econs le 19/04/2005 16:32:04 administrateur CS

log2002> Même erreur chez moi. Pas moyen de faire fonctionner ce code avec MSFlexgrid et MSHFlexgrid. Snif ...
Mais avec les autres contrôles, çà va.

Commentaire de Philippe734 le 19/04/2005 19:45:50

avec certaine type de form (mdi child...), cela ne marche qu'une fois compilé. et je s'en sai rien pkoi

:)

Commentaire de jonathan02 le 24/05/2005 23:24:07

Je débute en VB et j'aimerai savoir comment référencer le fichier Wheel.tlb.

Merci.

Commentaire de jonathan02 le 24/05/2005 23:59:50

C'est bon j'ai trouver !
merci

Commentaire de JoePatent le 08/08/2005 22:04:50

Le tout est compilé et ça ne fonctionne pas.

Prise en charge impossible.

Il s'agit d'un formulaire child qui roule dans une MDI...

Avez-vous trouvé une solution ?  Ce code est simple d'usage et j'aimerais vraiment l'implanter dans mes logiciels.

Commentaire de PCPT le 12/08/2005 21:20:08 administrateur CS

salut,

petit souci, ne fonctionne pas en projet compilé. je suis le seul?
PCPT

Commentaire de Migs le 29/08/2005 21:19:28

Cette source est super, mais ça ne marche pas pour plusieurs objets...

Commentaire de njulio le 15/09/2005 19:47:24

Je ne sais pas à quel niveau il faut écrire :
Call ActiverMoletteEtDéfinirObjetScroll(Formulaire1.MSHFlexGrid1)

si "Formulaire1" est le nom de ma feuille.

Commentaire de SgtKabukinan le 22/09/2005 15:21:22

dans l'evenement Form_Load

Commentaire de SgtKabukinan le 22/09/2005 15:31:52

d'ailleurs à ce propos
si tu as deux form qui a un datagrid avec la molette activée
et que tu ouvres une autre form avec un datagrid en activant la molette,
la molette ne fonctionne pas dans la seconde (pas d'erreur), et ne fonctionne plus non plus dans la première form (erreur)
Avis au amateurs

Commentaire de yoh_bur le 18/10/2005 15:41:15

Merci de ce code.
J'ai un petit problème que je ne comprends pas. J'ai developpé mon appli sur un fixe sur lequel la molette de la souris est tres bien prise en compte.
Je reprends aujourd'hui mon appli sur un portable, apres copie du projet (dans son ensemble) sur le portable, lorsque jele lance, il me dit bibliotheque introuvable (pour la fonction RegOpenKey). J'ai pourtant bien declaré le fichier wheel.tb dans les references. Merci d'avance de votre aide.

Commentaire de yoh_bur le 18/10/2005 15:44:53

Merci de ce code.
J'ai par contre un petit probleme avec. Je l'avais utilisé lors du developpement d'une appli sur mon fixe, il n'y avait aucun probleme (le fixe est sous XP).
Aujourd'hui, je reprends la meme appli sur un portable (aussi sous XP). Apres une copie du projet sur le dur du portable, je lance le projet. Je verifie que wheel.tb est bien declaré, et je lance une execution pour voir.
Il me mets alors: "projet ou bibliotheque introuvable" et plante sur la fonction RegOpenKey.
Pourriez vous me dire pourquoi?

Commentaire de yoh_bur le 18/10/2005 15:52:58

Merci de ce code.

J'ai par contre un petit problème avec lors du transfert de mon projet de mon fixe a mon portable (tout deux sous XP). Alors que tout fonctionne nickel sur le fixe, lorsque je lance le projet en execution sur le portable il m'annonce "projet ou bibliotheque introuvable".
J'ai pourtant bien declaré wheel.tb dans les references du projet (redeclaré apres copie).
Merci d'avance des reponses.

Commentaire de chris81 le 25/01/2006 11:52:33

bonjour,
je suis en train de tester ton code et il me retourne un erreur ici

    If RegOpenKey(HKEY_CURRENT_USER, HKEYDESKTOP, hKey) Then... il me dit procedure sub ou function on définie.
Saurais tu d'ou peux venir ce pb?

Commentaire de SgtKabukinan le 26/01/2006 11:29:44

Rajoute la déclaration de l'API dans le module ne private sur tu t'en sers pas autre part
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
                 ByVal hKey As Long, _
                 ByVal lpSubKey As String, _
                 phkResult As Long) As Long

Commentaire de SgtKabukinan le 26/01/2006 11:32:32

D'ailleurs mieux vaut mettre la déclaration dans le onfocus du grid
Call ActiverMoletteEtDéfinirObjetScroll(frm.grid)
et celle la dans le lostFocus
Call DesactiverMolette

Pour éviter tout problème

Commentaire de yohan_titi le 06/02/2006 17:34:01

Merci beaucoup pour ce code !

Chez moi il a fonctionné du 1er coup. Je cherchais ce type de source pour une Msflexgrid et ça marche !!!

Encore mille fois merci

Commentaire de Rrominet le 14/02/2006 17:03:51

Tout bonnement géniale cette source !!!

Moi qui me voyait déjà galéré des heures sur le sujet, pour finir ça m'a pris 3 minutes chrono en main pour intégrer ta source de partout :-)


Merciiiiiiiiiiiiii !!

Commentaire de Subierman le 29/05/2006 17:35:58

chez moi, ça marche pas avec les MSFlexgrid....

Commentaire de michpirm le 03/08/2006 16:26:15

Bonjour,

Merci pour ces lignes de codes qui fonctionnent bien.

J'ai juste un petit problème :

Si dans mes lignes de codes autres que les lignes de ce petit programme, j'ai un message erreur de débogage, de VB6 ce qui est normal, mais dès que je clique sur la fin du débogage, VB6 se ferme et ce depuis que j'ai installé ce programme pour la roulette de la souris.

Obligé de la relancer VB6!!??

Quelqu'un à la solution?

Michel

Commentaire de mosquitout le 03/11/2006 10:43:08

Idem, chez moi ca ne marche pas non plus avec les MsFlexGrid ! même compilé. (avec bien sur la dll Wheel.tb référencée)

Commentaire de Rrominet le 03/11/2006 13:17:14

J'ai aussi le problème sur un ordi où la molette ne fonctionne pas malgré ce code...
Et d'autres ordis où cela fonctionne nickel !!

Sinon juste pour info, pas mal de contrôles que j'ai pu créer ou réutiliser me plantent VB6.
Ca devient monnaie courante quand l'appli en utilise beaucoup ou est trop grosse. Sans doute qu'il y a des choses à ne pas faire en dev et qui font planter VB...

Le fait de passer de Win98 à WinXP m'avait permi à l'époque d'éviter beaucoup de plantages de VB, mais il en reste trop...

Commentaire de andalo le 22/08/2007 23:43:17

la fete, j'adore cette source.
En bon debutant que je suis j'essaye de suivre ce conseil suivant :
"D'ailleurs mieux vaut mettre la déclaration dans le onfocus du grid
Call ActiverMoletteEtDéfinirObjetScroll(frm.grid)
et celle la dans le lostFocus
Call DesactiverMolette
Pour éviter tout problème "

Le desactivermolette apparement n'existe pas, comment proceder??

Commentaire de med_sp2 le 07/09/2007 12:19:43

merci beaucoup

Commentaire de Philippe734 le 09/09/2007 18:18:46

pour désactiver la molette faite ceci dans une procédure de ce code :

call UnhookWindow

:)

Commentaire de andalo le 26/09/2007 03:03:06

c'est ragant, ne veux plus fonctioner une fois compilé!! j'ai vu que d'autres personnes ont ce souci, je maitrise pas assez pour ne trouver la cause.

Commentaire de Ouneufe le 20/11/2007 10:05:59

magnifique, beaucoup mieux que ce que j'utilisais auparavant.

Commentaire de pascamau le 05/06/2009 15:24:17

Super !
Ajout de la fonctionnalité Wheel en 30 secondes sur un MSFlexGrid sous VB6 portable,
et ça fonctionne en version compilée.
Merci.

Commentaire de cortexminus le 18/06/2009 09:13:43

Superbe fonctionnalité, mis en place en 1 min.
Dommage que je n'arrive pas à le faire marcher sur les 3 onglets d'un MSHFlexGrid.
Ca fonctionne uniquement sur le dernier onglet.
Merci !

Commentaire de bingo_bechir le 09/09/2009 13:46:28

je suis très triste car c'est ca ne fonctionne pas chez moi, svp aidez moi.
c'est urgent

Commentaire de bingo_bechir le 12/09/2009 09:19:08

finalement je suis arrivé
merci Philippe734

Commentaire de asimengo le 12/02/2010 10:40:38

merci beaucoup pour ce code, j'ai été obligé de m'y plonger, vu que j'ai une préférence pour le datagrid et c pas top de voir qu'on soit le seul à ne pas bénéficier de la molette dans ses applis au 21ème siècle.

Ci-dessous le module "Molette.bas" que j'ai retouché et adapter spécifiquement pour le Datagrid.
Vu que la recherche de la fenetre contenant le Datagrid était un peu à taton ici , j'ai ajouté un paramètre permettant de passer la hwnd du parent.

Option Explicit
'
' Original Idea From
' :) Ulli's VBMouseWheel (10.09.2002)
' then
' codé par EBArtSoft@ (2004) : VB6 Wheel AddIn : ebartsoft@hotmail.com
' pour activer la molette dans l'éditeur de VB6, y avait un copyright
' then
' modifié par philippe734 pour l'activation de la molette
' d'un object ayant :
' soit deux scroll bar, vertical et horizontale de type
' .scroll(cols as long, rows as long) (datagrid par ex)
' soit de type
' .toprow as long (flexgrid par ex)
' Rq : Référencer le fichier Wheel.tlb de EBArtSoft@
'

Private Const GWL_WNDPROC As Long = (-4)
Private Const WM_MOUSEWHEEL As Long = &H20A

Private Const PRPNAME As String = "WheelPrc"
Private Const m_def_DefaultLines As Long = 3


Private moDataGrid As Datagrid, mlLines As Long
Private mbWheelEnabled As Boolean
Private mhWnd As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
   (ByVal hWnd As Long, ByVal lpClassName As String, _
   ByVal nMaxCount As Long) As Long

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
   (ByVal hWnd As Long, ByVal lpString As String, _
   ByVal cch As Long) As Long

Public Sub LoadDatagrid(ByRef poDataGrid As Datagrid, Optional ByVal plParenthWnd As Long = 0, Optional ByVal plLines As Long = m_def_DefaultLines)
   Dim lRetVal As Long
   Dim sWinClassBuf As String * 255, sWinTitleBuf As String * 255
   Dim sWinClass As String, sWinTitle As String

    If plParenthWnd <> 0 Then
        lRetVal = GetClassName(plParenthWnd, sWinClassBuf, 255)
        sWinClass = StripNulls(sWinClassBuf)  ' remove extra Nulls & spaces
        lRetVal = GetWindowText(plParenthWnd, sWinTitleBuf, 255)
        sWinTitle = StripNulls(sWinTitleBuf)
        mhWnd = FindWindow(sWinClass, sWinTitle)
    Else
        'test si la fenetre est de class ThunderFormDC
        mhWnd = FindWindow("ThunderFormDC", vbNullString)
        
        'test si la fenetre est de class ThunderRT6FormDC (form vb6 une fois compilé)
        If mhWnd = 0 Then mhWnd = FindWindow("ThunderRT6FormDC", vbNullString)
        
        'test si la fenetre est de class MDIClient
        If mhWnd = 0 Then mhWnd = FindWindow("MDIClient", vbNullString)
    End If
    
    Set moDataGrid = poDataGrid
    mlLines = plLines
End Sub

Public Function GetWheelStatus() As Boolean
    GetWheelStatus = mbWheelEnabled
End Function

Public Sub SetWheelStatus(ByVal pbEnabledWheel As Boolean)
    If mbWheelEnabled Then Call UnhookWindow
    If pbEnabledWheel Then Call HookWindow
End Sub


Private Function StripNulls(ByRef psOriginalStr As String) As String
   ' This removes the extra Nulls so String comparisons will work
   If (InStr(psOriginalStr, Chr(0)) > 0) Then
      psOriginalStr = Left(psOriginalStr, InStr(psOriginalStr, Chr(0)) - 1)
   End If
   StripNulls = psOriginalStr
End Function

Private Sub HookWindow()
    If mhWnd = 0 Then
        'Prise en charge de la molette impossible
        mbWheelEnabled = False
    Else
        SetProp mhWnd, PRPNAME, GetWindowLong(mhWnd, GWL_WNDPROC)
        SetWindowLong mhWnd, GWL_WNDPROC, AddressOf WindowProc
        mbWheelEnabled = True
    End If
End Sub

Private Sub UnhookWindow()
Dim mWndProc As Long
    
    mWndProc = GetProp(mhWnd, PRPNAME)
    If mWndProc <> 0 Then
        RemoveProp mhWnd, PRPNAME
        SetWindowLong mhWnd, GWL_WNDPROC, mWndProc
        Set moDataGrid = Nothing
    End If
    mbWheelEnabled = False
End Sub

Private Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lWndProc As Long, lScrollTo As Long

    lWndProc = GetProp(hWnd, PRPNAME)
    If lWndProc <> 0 Then
        WindowProc = CallWindowProc(lWndProc, hWnd, uMsg, wParam, lParam)
        'wParam indique le mouvement de la molette
        'pour wParam négatif, c'est pour voir en haut
        'positif, on descend le curseur du scrollbar
    
        Select Case uMsg
            Case WM_MOUSEWHEEL
                WindowProc = 0
                lScrollTo = -Sgn(wParam) * mlLines / ((wParam And &HFFFF&) \ 4 + 1)   'compute new top line
                moDataGrid.Scroll 0, lScrollTo
        End Select
    End If
End Function


Mode d'emploi:
- Copier ce code dans un module
- Sur la form contenant le datagrid, rajouter les lignes suivantes dans les évenements spécifiés:
  Private Sub Form_Load()
     LoadDatagrid DataGrid1, Me.hWnd
  End Sub

  Private Sub Form_Activate()
     SetWheelStatus True
  End Sub

  Private Sub Form_Unload(Cancel As Integer)
     SetWheelStatus False
  End Sub

Commentaire de asimengo le 12/02/2010 11:17:24

Definitivement je peux en faire une DLL,
Je définit une classe comme suit:

Class1
------

Option Explicit
'
' Original Idea From
' :) Ulli's VBMouseWheel (10.09.2002)
' then
' codé par EBArtSoft@ (2004) : VB6 Wheel AddIn : ebartsoft@hotmail.com
' pour activer la molette dans l'éditeur de VB6, y avait un copyright
' then
' modifié par philippe734 pour l'activation de la molette
' d'un object ayant :
' soit deux scroll bar, vertical et horizontale de type
' .scroll(cols as long, rows as long) (datagrid par ex)
' soit de type
' .toprow as long (flexgrid par ex)
' Rq : Référencer le fichier Wheel.tlb de EBArtSoft@
'

Private Const GWL_WNDPROC As Long = (-4)
Private Const m_def_DefaultLines As Long = 3

Private mbWheelEnabled As Boolean
Private mhWnd As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
   (ByVal hWnd As Long, ByVal lpClassName As String, _
   ByVal nMaxCount As Long) As Long

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
   (ByVal hWnd As Long, ByVal lpString As String, _
   ByVal cch As Long) As Long


Public Property Set Datagrid(Optional ByVal plParenthWnd As Long = 0, Optional ByVal plLines As Long = m_def_DefaultLines, ByRef poDataGrid As Datagrid)
   Dim lRetVal As Long
   Dim sWinClassBuf As String * 255, sWinTitleBuf As String * 255
   Dim sWinClass As String, sWinTitle As String

    If plParenthWnd <> 0 Then
        lRetVal = GetClassName(plParenthWnd, sWinClassBuf, 255)
        sWinClass = StripNulls(sWinClassBuf)  ' remove extra Nulls & spaces
        lRetVal = GetWindowText(plParenthWnd, sWinTitleBuf, 255)
        sWinTitle = StripNulls(sWinTitleBuf)
        mhWnd = FindWindow(sWinClass, sWinTitle)
    Else
        'test si la fenetre est de class ThunderFormDC
        mhWnd = FindWindow("ThunderFormDC", vbNullString)
        
        'test si la fenetre est de class ThunderRT6FormDC (form vb6 une fois compilé)
        If mhWnd = 0 Then mhWnd = FindWindow("ThunderRT6FormDC", vbNullString)
        
        'test si la fenetre est de class MDIClient
        If mhWnd = 0 Then mhWnd = FindWindow("MDIClient", vbNullString)
    End If
    
    Set moDataGrid = poDataGrid
    mlLines = plLines
End Property

Public Property Get EnabledWheel() As Boolean
    EnabledWheel = mbWheelEnabled
End Property

Public Property Let EnabledWheel(ByVal pbEnabledWheel As Boolean)
    If mbWheelEnabled Then Call UnhookWindow
    If pbEnabledWheel Then Call HookWindow
End Property

Private Function StripNulls(ByRef psOriginalStr As String) As String
   ' This removes the extra Nulls so String comparisons will work
   If (InStr(psOriginalStr, Chr(0)) > 0) Then
      psOriginalStr = Left(psOriginalStr, InStr(psOriginalStr, Chr(0)) - 1)
   End If
   StripNulls = psOriginalStr
End Function

Private Sub HookWindow()
    If mhWnd = 0 Then
        'Prise en charge de la molette impossible
        mbWheelEnabled = False
    Else
        SetProp mhWnd, PRPNAME, GetWindowLong(mhWnd, GWL_WNDPROC)
        SetWindowLong mhWnd, GWL_WNDPROC, AddressOf WindowProc
        mbWheelEnabled = True
    End If
End Sub

Private Sub UnhookWindow()
Dim mWndProc As Long
    
    mWndProc = GetProp(mhWnd, PRPNAME)
    If mWndProc <> 0 Then
        RemoveProp mhWnd, PRPNAME
        SetWindowLong mhWnd, GWL_WNDPROC, mWndProc
    End If
    mbWheelEnabled = False
End Sub

Private Sub Class_Terminate()
    Set moDataGrid = Nothing
End Sub

Puis un module définit comme suit:

Module1
-------

Option Explicit

Private Const WM_MOUSEWHEEL As Long = &H20A

Public Const PRPNAME As String = "WheelPrc"
Public moDataGrid As Datagrid, mlLines As Long

Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lWndProc As Long, lScrollTo As Long

    lWndProc = GetProp(hWnd, PRPNAME)
    If lWndProc <> 0 Then
        WindowProc = CallWindowProc(lWndProc, hWnd, uMsg, wParam, lParam)
        'wParam indique le mouvement de la molette
        'pour wParam négatif, c'est pour voir en haut
        'positif, on descend le curseur du scrollbar
    
        Select Case uMsg
            Case WM_MOUSEWHEEL
                WindowProc = 0
                lScrollTo = -Sgn(wParam) * mlLines / ((wParam And &HFFFF&) \ 4 + 1)   'compute new top line
                moDataGrid.Scroll 0, lScrollTo
        End Select
    End If
End Function



Mode d'emploi:
Dans votre Form contenant le datadrid1 mettre le code suivant
Option Explicit
Private moCls As Class1

Private Sub Form_Activate()
    moCls.EnabledWheel = True
    
'    SetWheelStatus True
End Sub

Private Sub Form_Load()
    Set moCls.Datagrid(Me.hWnd) = DataGrid1
    
'    LoadDatagrid DataGrid1, Me.hWnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
    moCls.EnabledWheel = False
    
'    SetWheelStatus False
End Sub

Private Sub Form_Initialize()
    Set moCls = New Class1
End Sub

Private Sub Form_Terminate()
    Set moCls = Nothing
End Sub

Encore merci à tous, please retourner si optimisation possible.
voila, j'ai pas voulu ravir la vedette aux autres en publiant une new Source, celle a déjà beaucoup de coms, meme pour moi ca me sert à comprendre l'évolution.

EB si tu passes par là, me dire comment contourner les bugs.
A+

Commentaire de asimengo le 14/02/2010 14:12:09

En definitive, j'ai du faire une source bien plus portable, voir http://www.vbfrance.com/codes/INTEGRATION-AUTOMATIQUE-ROULETTE-MOLETTE-SOURIS-DANS-VOS-APPLIS_51291.aspx

Commentaire de Philippe734 le 27/07/2010 23:48:05

Depuis que j'ai découvert les modules de renfield pour subclasser (vbfrance.com/codes/MODULE-SUBCLASSER_38442.aspx), je n'utilise plus ma source. J'utilise ses modules dont le code de prise en charge de la molette pour une datagrid donne :

Private Function ISubclasser_WindowProc(ByVal hWnd As Long, ByVal uMsg As MessageConstants, ByVal wParam As Long, ByVal lParam As Long) As Long
    If hWnd <> mtWin1.hWnd Then Exit Function
    ISubclasser_WindowProc = CallOldProc(mtWin1, hWnd, uMsg, wParam, lParam)
    If uMsg = WM_MOUSEWHEEL Then Form1.DataGrid1.Scroll 0, 3 * Sgn(-wParam)
End Function

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,619 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales