INTEGRATION AUTOMATIQUE DE LA ROULETTE/MOLETTE DE LA SOURIS DANS VOS APPLIS

Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
- - Dernière réponse : cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009
- 8 août 2010 à 22:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51291-integration-automatique-de-la-roulette-molette-de-la-souris-dans-vos-applis

PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
28 -
salut,

pas testé mais à la lecture en diagonale, c'est incorrect :
tu dois gérer une collection de classes
ici tu changes le handle observé lors de l'activate, masquant le problème (avec cet exemple pour une form). tu as donc une seule observation possible par projet

mais suppose l'observation d'une form (ok) ET d'un bouton sur cette form?

ou de 2 grids (ton projet de départ) sur une même form?
l'évènement relevé ne sera pas celui du control concerné

collection de class, la winproc doit appeler le raise de la class ayant le même handle
NB : attention à bien gérer un clé STRING

++
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009
-
@PCPT: l'exemple effectivement va ds le sens de montrer qu'on peut se passer de la collection, c pourkoi j'ai montre qu'on peut gerer facilement le changement d'un form à un autre. je te recommande de lire la source, tu veras que c'est bien mieux pensé qu'il ne parait.
A la différence de la source de Daetips, qui gere le scroll sur les objets, le mien a pour seul but de renvoyer les evenements molette sur le Hwnd voulu. par défaut le form conteneur.
Pr l'évenement "Activate" je voulais demontrer que le developpeur a la main plus sur le fait de ramener la capture sur la form active. Chaque form qui a le focus, ramene automatiquement la capture sur lui.
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009
-
J'ai pensé à une autre approche, celle de rediriger les evenements de la molette sur les evenements mouse (MouseMove, MoveDown, MouseUp) en definissant une constante approprie pour le paramettre "Button" qui permettra de differencier avec les evenements standards.

je suis pour le moment dans la recherche des bons parametres à passer à la Winproc, voir Winproc ci-dessous, au cas ou quelqu'un aurait une idee.

Public Function WindowProc(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo Err_WindowProc
Dim wParam2 As Long, lParam2 As Long

Select Case uMsg
Case WM_MBUTTONDOWN:
wParam2= ...
lParam2= ...
WindowProc = CallWindowProc(mlAddressOfWndProc, Hwnd, WM_MOUSEDOWN, wParam2, lParam2)
Case WM_MBUTTONUP:
wParam2= ...
lParam2= ...
WindowProc = CallWindowProc(mlAddressOfWndProc, Hwnd, WM_MOUSEUP, wParam2, lParam2)
Case WM_MBUTTONDBLCLK:
wParam2= ...
lParam2= ...
WindowProc = CallWindowProc(mlAddressOfWndProc, Hwnd, WM_MOUSEDOWN, wParam2, lParam2)
Case WM_MOUSEWHEEL:
wParam2= ...
lParam2= ...
WindowProc = CallWindowProc(mlAddressOfWndProc, Hwnd, WM_MOUSEMOVE, wParam2, lParam2)
Case Else:
'Si on est là c'est parcequ'il ya eu subclassing dont mlAddressOfWndProc est valide
WindowProc = CallWindowProc(mlAddressOfWndProc, Hwnd, uMsg, wParam, lParam)
End Select

Exit_WindowProc:
Exit Function

Err_WindowProc:
' MsgBox "Hwnd = " & Hwnd & vbCrLf & _
' "AddressOfWndProc = " & mlAddressOfWndProc & vbCrLf & vbCrLf & _
' "Error = " & Err & vbCrLf & _
' Err.Description
Resume Exit_WindowProc
End Function
PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
28 -
la source est lue ^^. en diagonale mais assez pour avoir laissé le commentaire ;)

ce n'est pas la bonne conception.
si ta source est une sorte d'allégé (pourquoi pas), et que pour fonctionner comme tu l'avais en tête (pas de collection) il doit y avoir un changement de handle lors de l'activate, c'est ta classe qui doit alors observer cet activate pour switcher. ce n'est pas au dev de le faire.

je parle bien uniquement de conception.
après, "qui peut le moins ne pourra pas le plus", mais c'est ton choix, pas de problème

bonne continuation
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009
-
@PCPT: Pour etre plus precis, la source de Daetips a ceci de genial que c'est un programme resident qui gere globalement la molette pour tous les forms demandeurs. Le mien a la particularité, que la demande doit etre faite par le form demandeur. ca se passe cmt?, sur "activate, gotfocus", jai besoin, je demande, sur "Lostfocus, Unload" je n'ai plus besoin je libere. Je pense avoir ete plus precis. C'est une approche différente de celle de Daetips mais qui du moins est aussi interessante.
Par cette occasion, je vois que j'ai oublie de faire un truc important celui de commencer par executer la procedure normale avant de gerer les evenements.

Ceci apporte une modification à la Winproc qui devient ceci:

Public Function WindowProc(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo Err_WindowProc

'Si on est là c'est parcequ'il ya eu subclassing dont mlAddressOfWndProc est valide
'Commencer toujours par appeler la procedure par défaut afin que les autres objets puissent gerer les evenements
'Le detournement se fait apres
WindowProc = CallWindowProc(mlAddressOfWndProc, Hwnd, uMsg, wParam, lParam)

Select Case uMsg
Case WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK: voClsWheel.SetMouseWheelEvent uMsg
Case WM_MOUSEWHEEL:
'wParam indique le mouvement de la molette
'pour wParam négatif, c'est pour voir en haut
'positif, on descend le curseur du scrollbar

voClsWheel.SetMouseWheelEvent uMsg, Sgn(wParam)
Case Else:
End Select

Exit_WindowProc:
Exit Function

Err_WindowProc:
' MsgBox "Hwnd = " & Hwnd & vbCrLf & _
' "AddressOfWndProc = " & mlAddressOfWndProc & vbCrLf & vbCrLf & _
' "Error = " & Err & vbCrLf & _
' Err.Description
Resume Exit_WindowProc
End Function