OVH Cloud OVH Cloud

Réglage de la molette

11 réponses
Avatar
Barsalou
Bonjour

Est-il possible d'avoir accès au paramètre de réglage du défilement provoqué
par la molette de la souris ?
J'aimerais le sauvegarder, le changer, et enfin le rétablir, de façon que
dans mon programme le défilement se produise comme je le souhaite..

Merci

10 réponses

1 2
Avatar
ng
Salut,

Que veux-tu faire exactement ? Récupérer les évenements de la molette ou les
paramètres de défilement ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


Barsalou wrote:
Bonjour

Est-il possible d'avoir accès au paramètre de réglage du défilement
provoqué par la molette de la souris ?
J'aimerais le sauvegarder, le changer, et enfin le rétablir, de façon
que dans mon programme le défilement se produise comme je le
souhaite..

Merci


Avatar
Barsalou
Merci de t'intéresser au problème.*
Je voudrais modifier les paramètres de défilement, pour qu'un déclic de la
roulette fasse un déplacement d'une seule ligne, et bien sûr remettre les
choses en l'état à la fermeture du programme.
Avatar
Jean-Marc
"Barsalou" a écrit dans le message de
news:
Merci de t'intéresser au problème.*
Je voudrais modifier les paramètres de défilement, pour qu'un déclic de la
roulette fasse un déplacement d'une seule ligne, et bien sûr remettre les
choses en l'état à la fermeture du programme.



Hello,

peut être pourrais tu préciser un peu les choses?
Tu parles de déplacement "d'une seule ligne" ? On
ne peut pas deviner de quoi tu parles. Il faudrait
préciser le contexte: dans quel composant, le
contenu du composant à l'instant t, ce que tu obtiens
actuellement, ce que tu souhaites obtenir, etc.
Essaie de décrire avec le plus de détails possibles.
Mieux encore: extrait de ton code le minimum, ou
construit un exemple illustrant la situation afin
que l'on puisse:
1/ reproduire
2/ trouver une solution

Avec tout ceci, je suis sur que tu trouveras ici
même plein de personnes de bonne volonté pour
t'aider :-)

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Barsalou
Salut

Je vois que je n'ai pas été clair.

Dans mon programme j'ai un bon nombre de ListBox dont la hauteur de fenêtre
ne permet de voir qu'une seule ligne, ceci pour des raisons encombrement.
On peut bien sûr naviguer dans ces ListBox à l'aide des ascenseurs, mais
également avec la molette de la souris.

Or le réglage de cette molette (par Intellipoint, TweakUi, ou autre) peut
être tel que, par exemple, 3 lignes, c'est à dire trois choix possibles dans
la ListBox, sautent pour chaque déclic de la molette (c'est par exemple ce
qui se produit chez moi dans l'environnement de programmation de VB).
Je voudrais tout simplement pouvoir passer tranquillement d'une ligne à la
suivante (ou la précédente) à chaque déclic de molette, en modifiant ce
réglage dans le programme, et rétablir à la fin la valeur initialement
choisie par l'utilisateur (3 lignes chez moi).

J'espère que l'on me comprend maintenant !

Merci à tous
Avatar
ng
Salut,

Dans ce cas la meilleure méthode n'est pas de changer les paramètres de
l'utilisateur mais de subclasser soit même le message WM_MOUSEWHEEL :

Voici un exemple :

'//Dans Form1 :

Option Explicit

Private Sub Form_Load()
Call SubClass(List1.hwnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnSubClass(List1.hwnd)
End Sub


Public Sub onMouseWheel(Direction As Integer)
Call MoveListBoxTopIndex(Direction, List1)
'//ou
'//Call MoveListBoxListIndex(Direction, List1)
'//C'est au choix, ca dépend de l'effet désiré,MoveListBoxListIndex()
'//sélectionne automatiquement la ligne déplacée alors que
MoveListBoxTopIndex() non.
End Sub

Public Sub MoveListBoxListIndex(wDirection As Integer, oList As ListBox)
If wDirection = 1 Then
If oList.ListIndex > 0 Then oList.ListIndex = oList.ListIndex - 1
Else
If oList.ListIndex < (oList.ListCount - 1) Then oList.ListIndex oList.ListIndex + 1
End If
End Sub

Public Sub MoveListBoxTopIndex(wDirection As Integer, oList As ListBox)
If wDirection = 1 Then
If oList.TopIndex > 0 Then oList.TopIndex = oList.TopIndex - 1
Else
If oList.TopIndex < (oList.ListCount - 1) Then oList.TopIndex oList.TopIndex + 1
End If
End Sub


'//Dans un module :

Option Explicit

Private Declare Function CallWindowProc _
Lib "user32" _
Alias "CallWindowProcA" _
( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) As Long

Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) As Long


Private Const WHEEL_DELTA = 120
Private Const WHEEL_PAGESCROLL = &HFFFFFFFF
Private Const WM_MOUSEWHEEL = &H20A


Private Const GWL_WNDPROC As Long = -4
Private m_lOldProc As Long

Public Sub SubClass(ByRef hwnd As Long)
m_lOldProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnSubClass(ByRef hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, m_lOldProc
End Sub

Public Function WindowProc _
( _
ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) As Long

Select Case uMsg
Case WM_MOUSEWHEEL
'message molette tournée
If (HiWord(wParam) / WHEEL_DELTA) < 0 Then
Call Form1.onMouseWheel(2)
Else
Call Form1.onMouseWheel(1)
End If
Case Else
WindowProc = CallWindowProc(m_lOldProc, hwnd, uMsg, wParam,
lParam)
End Select

End Function
Public Function HiWord(dw As Long) As Integer
If dw And &H80000000 Then
HiWord = (dw 65535) - 1
Else
HiWord = dw 65535
End If
End Function
Public Function LoWord(dw As Long) As Integer
If dw And &H8000& Then
LoWord = &H8000 Or (dw And &H7FFF&)
Else
LoWord = dw And &HFFFF&
End If
End Function


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


Barsalou wrote:
Salut

Je vois que je n'ai pas été clair.

Dans mon programme j'ai un bon nombre de ListBox dont la hauteur de
fenêtre ne permet de voir qu'une seule ligne, ceci pour des raisons
encombrement. On peut bien sûr naviguer dans ces ListBox à l'aide des
ascenseurs, mais également avec la molette de la souris.

Or le réglage de cette molette (par Intellipoint, TweakUi, ou autre)
peut être tel que, par exemple, 3 lignes, c'est à dire trois choix
possibles dans la ListBox, sautent pour chaque déclic de la molette
(c'est par exemple ce qui se produit chez moi dans l'environnement de
programmation de VB).
Je voudrais tout simplement pouvoir passer tranquillement d'une ligne
à la suivante (ou la précédente) à chaque déclic de molette, en
modifiant ce réglage dans le programme, et rétablir à la fin la
valeur initialement choisie par l'utilisateur (3 lignes chez moi).

J'espère que l'on me comprend maintenant !

Merci à tous


Avatar
Barsalou
Merci, je vais essayer tout ça, bien que je n'y comprenne pas grand chose.
Où trouver des infos sur la notion de sous classer un contrôle ?

Salut à tous
Avatar
Barsalou
Salut

Ton exemple marche parfaitement tel quel
.
Cependant j'ai sur ma feuille 40 listbox, en deux groupes indexés list1() et
list2(), et du coup cela ne marche pas.
Que faut-il modifier à ton avis ? Sans doute appliquer subclass et
unsubclass à toutes les listbox, ce que j'ai fait, mais encore ?

Dans ton exemple la liste change quand la molette tourne quelle que soit la
position de la souris sur la feuille.
Dans mon cas c'est seulement quand le curseur de la souris est sur la liste

En outre j'ai le même problème dans plusieurs feuilles, et c'est pourquoi il
me semblait plus simple de changer une fois pour toutes le paramètre
utilisateur

Merci de ton aide
Avatar
ng
Salut,

Il faudrait utiliser un tabelau dans le module de subclassing, sinon il y
aurait une autre solution : subclasser la form et déplacer la listbox que le
curseur survol.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


Barsalou wrote:
Salut

Ton exemple marche parfaitement tel quel
.
Cependant j'ai sur ma feuille 40 listbox, en deux groupes indexés
list1() et list2(), et du coup cela ne marche pas.
Que faut-il modifier à ton avis ? Sans doute appliquer subclass et
unsubclass à toutes les listbox, ce que j'ai fait, mais encore ?

Dans ton exemple la liste change quand la molette tourne quelle que
soit la position de la souris sur la feuille.
Dans mon cas c'est seulement quand le curseur de la souris est sur la
liste

En outre j'ai le même problème dans plusieurs feuilles, et c'est
pourquoi il me semblait plus simple de changer une fois pour toutes
le paramètre utilisateur

Merci de ton aide


Avatar
Barsalou
Salut

Je n'ai pas réussi à me démerder. J'ai fait quelques essais qui ont eu
essentiellement pour effet de me planter.

Il faut dire que je ne connais rien à l'idée de sous-classer.

Ce serait super si pouvais me faire un exemple avec un petit groupe de
ListBox (ou mieux deux groupes).

J'espérais naïvement qu'il existait une API permettant de modifie les
paramètres de la molette. Je n'ai rien trouvé.

Merci en tout cas de tes efforts.
Avatar
ng
Salut,

Ok je vais essayer.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Barsalou wrote:
Salut

Je n'ai pas réussi à me démerder. J'ai fait quelques essais qui ont eu
essentiellement pour effet de me planter.

Il faut dire que je ne connais rien à l'idée de sous-classer.

Ce serait super si pouvais me faire un exemple avec un petit groupe de
ListBox (ou mieux deux groupes).

J'espérais naïvement qu'il existait une API permettant de modifie les
paramètres de la molette. Je n'ai rien trouvé.

Merci en tout cas de tes efforts.


1 2