Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Roulette de souris

11 réponses
Avatar
Pierre Rivet
Bonsoir,

Je cherche s'il existe un moyen de piloter avec VB6 la roulette de souris,
de manière à naviguer rapidement dans un contrôle DataGrid,
qui peut avoir quelquefois plusieurs centaines, voire plusieurs milliers de
lignes.

Merci beaucoup à l'avance,

Pierre

10 réponses

1 2
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7
Salut,

Il te suffit de sous-classer la feuille, de capter le message de roulette et
de le gérer comme tu veux. Je l'ai fait (pas sur un datagrid, cependant) et
cela fonctionne très bien.

Christian

"Pierre Rivet" a écrit dans le message de
news:4a5ca580$0$23461$
Bonsoir,

Je cherche s'il existe un moyen de piloter avec VB6 la roulette de souris,
de manière à naviguer rapidement dans un contrôle DataGrid,
qui peut avoir quelquefois plusieurs centaines, voire plusieurs milliers
de
lignes.

Merci beaucoup à l'avance,

Pierre




Avatar
Pierre Rivet
Merci, Christian, de l'explication, mais j'avoue que je ne comprends pas
bien ta réponse...

Pourrais-tu être plus explicite .

Dans la FAQ de VB6, il y a un item qui répond à la question. J'ai installé
le dll, mais ça ne fonctionne pas...

Pierre

"Christian Hubert-Hugoud / weabow - Xtrem7" a écrit dans
le message de news: eR0$
Salut,

Il te suffit de sous-classer la feuille, de capter le message de roulette
et de le gérer comme tu veux. Je l'ai fait (pas sur un datagrid,
cependant) et cela fonctionne très bien.

Christian

"Pierre Rivet" a écrit dans le message de
news:4a5ca580$0$23461$
Bonsoir,

Je cherche s'il existe un moyen de piloter avec VB6 la roulette de
souris,
de manière à naviguer rapidement dans un contrôle DataGrid,
qui peut avoir quelquefois plusieurs centaines, voire plusieurs milliers
de
lignes.

Merci beaucoup à l'avance,

Pierre







Avatar
Jean-marc
Pierre Rivet wrote:
Merci, Christian, de l'explication, mais j'avoue que je ne comprends
pas bien ta réponse...

Pourrais-tu être plus explicite .

Dans la FAQ de VB6, il y a un item qui répond à la question. J'ai
installé le dll, mais ça ne fonctionne pas...



Hello,

Fais tu référence à l'article 134 de la FAQ ? :
http://faq.vb.free.fr/index.php?question4

Si oui, c'est bien normal; cet article indique comment activer la roulette
dans l'IDE de VB6, pas dans les composants.

Pour pouvoir utiliser la roulette, il faut effectivement utiliser
le sous-classement.

Un bon exemple est donné ici:
http://www.vbfrance.com/codes/UTILISATION-MOLETTE-ROULETTE-SOURIS_25201.aspx

Cordialement;

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Pierre Rivet
Bonjour Jean Marc,

Merci encore de ta patience. C'est effectivement la question 134 que j'avais
"chiadée", sans succès.

J'ai travaillé sur ta proposition ci-dessous.J'ai bien téléchargé le code
dans le module, et référencé Wheel.tlb comme indiqué.

Par contre, je ne sais pas où placer la ligne
Call ActiverMoletteEtDéfinirObjetScroll(BibliEditions.DataGridLivres)

J'ai essayé de la mettre dans le module
J'ai essayé de la mettre dans le Form_Load() de la page BibliEditions

Ma Datagrid reste désespérément inerte, sauf avec les scrollbars d'origine.
Où est l'erreur ? Je ne comprends toujours pas le "sous classement" ?

Merci à l'avance,

Pierre


Pour pouvoir utiliser la roulette, il faut effectivement utiliser
le sous-classement.

Un bon exemple est donné ici:
http://www.vbfrance.com/codes/UTILISATION-MOLETTE-ROULETTE-SOURIS_25201.aspx

Cordialement;

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Vincent Guichard
Pierre Rivet a écrit :
J'ai essayé de la mettre dans le Form_Load() de la page BibliEditions


Ca me semble pourtant un bon endroit pour le mettre (attention, il faut
que le contrôle msflexgrid soit dans cette feuille).

Je ne comprends toujours pas le "sous classement" ?


Le système Windows marche grâce à des messages qui sont transmis en tre
l'OS et les différentes fenêtres des applications. Quand tu fais tour ner
la molette de ta souris, tu génères un message
"la_molette_de_la_souris_a_tourné" (en fait son nom est WM_MOUSEWHEEL).
L'OS reçoit ce message du driver de la souris et le transmet à
l'application active, qui le transmet au contrôle actif (ici le
msflexgrid). La fonction qui traite les messages reçu est appelée
WindowProc (WP). Manque de bol, le contrôle ne sait pas quoi faire de c e
message dans ton cas. Il faut donc lui apprendre comment faire.

Pour cela il y a deux solutions, le 'subclassing' et le 'hooking'

Le subclassing (sous classement), cela consiste à remplacer la WP
habituelle du contrôle par une WP 'Maison' qui va faire le boulot à s a
place. Cela s'applique donc au niveau du contrôle.
C'est ce dont tu as besoin ici.

Le hooking (ça veux dire crochet en anglais, et je ne sais pas comment
on traduit la technique en français), cela consiste à intercaler une WP
'maison' créée pour l'occasion dans la pile des appels de Windows. To us
les messages vont transiter par cette fonction avant d'aller à la
fonction qui les recevrait en temps normal. C'est un peu (beaucoup) plus
intrusif que le sous classement, puisque cela s'applique soit au niveau
de l'application, soit au niveau du système.

Pour revenir sur le sous classement, il faut faire au moins deux choses
pour sous classer un contrôle:
1. Créer une fonction Wp qui va faire le travail demandé
2. Remplacer la WP initiale par notre WP à nous

En général, on veut aussi que le contrôle continue à faire ce qu' il
faisait avant, donc plutôt que réécrire la gestion de tous les mess ages,
on va préférer faire un appel à la WP initiale depuis notre WP 'mai son'.
On va donc mémoriser l'adresse de la WP initiale avant de la remplacer
par la notre, pour pouvoir l'appeler ultérieurement.

En résumé:
Dans la WP maison: on traite les messages qu'on veut traiter, et on
appelle la WP initiale pour tous les messages dont on ne veut pas
modifier le traitement.
Dans la fonction de Sous classement: on mémorise l'adresse de la WP
initiale et on la remplace par notre WP maison.

Fonctions clés:
CallWindowProc pour appeler la WP initiale depuis la WP maison
SetProp pour sauver l'adresse de la WP initiale
GetProp pour retrouver l'adresse de la WP initiale
SetWindowLong pour remplacer une WP par une autre

Dans l'exemple donné par Jean-Marc, le codeur utilise le terme Hook pou r
faire du sous classement, mais c'est bien du sous classement qu'il fait
et pas du hooking

Vincent Guichard
Avatar
Pierre Rivet
Merci , Vincent, de tes explications,

Décidément, mon problème semble intéressant.

J'ai fait un essai sur une petite application de bibliothèque personnelle,
où j'ai deux Datagrid.
Sur l'un des deux, la roulette fonctionne parfaitement.
Sur l'autre, elle ne fonctionne pas.

J'ai essayé de faire le cheminement pas à pas. Je n'obtiens pas les mêmes
valeurs dans les fonctions. Pourquoi ?

Avec tes explications, j'ai suivi les différentes étapes de la fonction.
Attention, j'ai des Datagrid et non des msflexgrid .

Public Sub ActiverMoletteEtDéfinirObjetScroll(ByVal
QuelObjetFautilScrollerDeTypeScrollVerticaleEtHorizontale As Object)
En fait, la variable "QuelObjet.....Horizontale" est la première valeur de
la Datagrid (1ère ligne et 1ère colonne)

J'ai (pas tout) compris tes explications sur le sous-classement, mais j'ai
des trous !!
Pourquoi un Datagrid "roulette" bien et pas un autre ? alors que j'ai mis la
même ligne
Call ActiverMoletteEtDéfinirObjetScroll(Me.DataGrid1)
dans la procédure Form_Load() de chacune des feuilles ?

Merci de ta patience,

Pierre


"Vincent Guichard" a écrit dans le message de
news: 4a5ee412$0$17771$
Pierre Rivet a écrit :
J'ai essayé de la mettre dans le Form_Load() de la page BibliEditions


Ca me semble pourtant un bon endroit pour le mettre (attention, il faut
que le contrôle msflexgrid soit dans cette feuille).

Je ne comprends toujours pas le "sous classement" ?


Le système Windows marche grâce à des messages qui sont transmis entre
l'OS et les différentes fenêtres des applications. Quand tu fais tourner
la molette de ta souris, tu génères un message
"la_molette_de_la_souris_a_tourné" (en fait son nom est WM_MOUSEWHEEL).
L'OS reçoit ce message du driver de la souris et le transmet à
l'application active, qui le transmet au contrôle actif (ici le
msflexgrid). La fonction qui traite les messages reçu est appelée
WindowProc (WP). Manque de bol, le contrôle ne sait pas quoi faire de ce
message dans ton cas. Il faut donc lui apprendre comment faire.

Pour cela il y a deux solutions, le 'subclassing' et le 'hooking'

Le subclassing (sous classement), cela consiste à remplacer la WP
habituelle du contrôle par une WP 'Maison' qui va faire le boulot à sa
place. Cela s'applique donc au niveau du contrôle.
C'est ce dont tu as besoin ici.

Le hooking (ça veux dire crochet en anglais, et je ne sais pas comment
on traduit la technique en français), cela consiste à intercaler une WP
'maison' créée pour l'occasion dans la pile des appels de Windows. Tous
les messages vont transiter par cette fonction avant d'aller à la
fonction qui les recevrait en temps normal. C'est un peu (beaucoup) plus
intrusif que le sous classement, puisque cela s'applique soit au niveau
de l'application, soit au niveau du système.

Pour revenir sur le sous classement, il faut faire au moins deux choses
pour sous classer un contrôle:
1. Créer une fonction Wp qui va faire le travail demandé
2. Remplacer la WP initiale par notre WP à nous

En général, on veut aussi que le contrôle continue à faire ce qu'il
faisait avant, donc plutôt que réécrire la gestion de tous les messages,
on va préférer faire un appel à la WP initiale depuis notre WP 'maison'.
On va donc mémoriser l'adresse de la WP initiale avant de la remplacer
par la notre, pour pouvoir l'appeler ultérieurement.

En résumé:
Dans la WP maison: on traite les messages qu'on veut traiter, et on
appelle la WP initiale pour tous les messages dont on ne veut pas
modifier le traitement.
Dans la fonction de Sous classement: on mémorise l'adresse de la WP
initiale et on la remplace par notre WP maison.

Fonctions clés:
CallWindowProc pour appeler la WP initiale depuis la WP maison
SetProp pour sauver l'adresse de la WP initiale
GetProp pour retrouver l'adresse de la WP initiale
SetWindowLong pour remplacer une WP par une autre

Dans l'exemple donné par Jean-Marc, le codeur utilise le terme Hook pour
faire du sous classement, mais c'est bien du sous classement qu'il fait
et pas du hooking

Vincent Guichard
Avatar
Vincent Guichard
Pierre Rivet a écrit :
Merci , Vincent, de tes explications,

Décidément, mon problème semble intéressant.

J'ai fait un essai sur une petite application de bibliothèque personn elle,
où j'ai deux Datagrid.
Sur l'un des deux, la roulette fonctionne parfaitement.
Sur l'autre, elle ne fonctionne pas.


C'est simple, le code que tu utilise ne permet pas de sous classer
plusieurs contrôles. Si tu regardes bien, il y a un booleen
bMoletteActive qui supprime le sous classement sur le premier controle
si tu le mets sur un autre.


Merci de ta patience,

Pierre


Avatar
Pierre Rivet
Merci, Vincent,

Je subordorais quelque chose dans ce style....

Je vais maintenant "me retirer dans le silence de mon Cabinet" pour
approfondir.....

Je donnerai des nouvelles...

A bientôt,

Pierre

"Vincent Guichard" a écrit dans le message de
news: 4a603742$0$23479$
Pierre Rivet a écrit :
Merci , Vincent, de tes explications,

Décidément, mon problème semble intéressant.

J'ai fait un essai sur une petite application de bibliothèque personnelle,
où j'ai deux Datagrid.
Sur l'un des deux, la roulette fonctionne parfaitement.
Sur l'autre, elle ne fonctionne pas.


C'est simple, le code que tu utilise ne permet pas de sous classer
plusieurs contrôles. Si tu regardes bien, il y a un booleen
bMoletteActive qui supprime le sous classement sur le premier controle
si tu le mets sur un autre.


Merci de ta patience,

Pierre


Avatar
Vincent Guichard
Vincent Guichard a écrit :
Pierre Rivet a écrit :
Merci , Vincent, de tes explications,

Décidément, mon problème semble intéressant.

J'ai fait un essai sur une petite application de bibliothèque
personnelle, où j'ai deux Datagrid.
Sur l'un des deux, la roulette fonctionne parfaitement.
Sur l'autre, elle ne fonctionne pas.


C'est simple, le code que tu utilise ne permet pas de sous classer
plusieurs contrôles. Si tu regardes bien, il y a un booleen
bMoletteActive qui supprime le sous classement sur le premier controle
si tu le mets sur un autre.


Merci de ta patience,

Pierre





Pour être plus précis, le code utilise des variables globales pour
mémoriser pas mal de choses (ce qui n'est pas une bonne idée en
général), d'où l'utilité du booléen.

Tu peux essayer d'appeler la fonction de sous classement à chaque fois
qu'un datagrid gagne le focus, ça devrais résoudre ton problème, mê me si
ce n'est pas une façon très propre de faire à mon avis.

Vincent Guichard
Avatar
Pierre Rivet
Heureusement que je viens de voir ton dernier message, parce que depuis tout
à l'heure, j'étais en train de "merder" copieusement.

Effectivement, ça fonctionne dans toutes les pages avec Datagrid, quand on
met une commande intermédiaire,

soit, par exemple, double click sur le Datagrid
soit un bouton de commande, demandant [avance rapide de la souris ?]

L'astuce serait que cela soit "transparent" pour l'utilisateur, mais on s'en
rapproche. J'ai quand même une application avec des dizaines de Datagrid
!!!!!

Merci encore,

Pierre

***********************************************
Pour être plus précis, le code utilise des variables globales pour
mémoriser pas mal de choses (ce qui n'est pas une bonne idée en
général), d'où l'utilité du booléen.

Tu peux essayer d'appeler la fonction de sous classement à chaque fois
qu'un datagrid gagne le focus, ça devrais résoudre ton problème, même si
ce n'est pas une façon très propre de faire à mon avis.

Vincent Guichard
1 2