Le subclassing : une autre façon pour les événements

Description

Voilà un article (de moi) qui vous expliquera le subclassing. vous le trouverez dans le ZIP en mieux avec l'exemple

Le subclassing est la mise en place d'une
fonction remplacement l'actuel fonction
de gestion des évenement

A quoi il peut servir ?
-----------------------
Il sert à détecter des évenements que VB
ne reconnait pas (sélection d'un menu,
sortie du curseur de la souris...) mais
également tous les autres(un filtre avec
select case sera nécéssaire).

Ses contraites
--------------
Durant le subclassing, vous NE DEVEZ PAS
cliquer sur 'Stop' (crash de vb). de
plus, la fonction WindowProc(voir ci dessous)
ne doit contenir aucune erreur et
elle(la fonction) est appelée souvent.

Déclaration API
---------------
Seulement 2 APIs et 1 contantes sont
nécessaire pour faire du subclassing

"Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long"
"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"
"Public Const GWL_WNDPROC = (-4)"

Il faut savoir que SetWindowLong a d'autres
usage selon la constante mise dans 'nIndex'

Fonctionnement des évenement sous Windows
-----------------------------------------

______________________________________
| |
| |
| Utilisateur clique |
| | |
| \|/ |
| Windows traite l'info |
| et l'envoie à VB |
| | |
| \|/
| VB convertie l'info en event VB |
| | |
| \|/ |
| sub Form_Click... |
| |
_______figure 1 : event sous VB________

Figure 1 : Elle montre la gestion sous Windows
des événements avec VB

______________________________________
| |
| |
| Utilisateur clique |
| | |
| \|/ |
| Windows traite l'info |
| et l'envoie à WindowProc |
| | |
| \|/ |
| *** La fonction VB WindowProc *** |
| *** traite l'info et appele la *** |
| *** fonction d'évenement de Vb *** |
| | |
| \|/ |
| VB convertie l'info en event VB |
| | |
| \|/ |
| sub Form_Click... |
| |
_______figure 1 : event sous VB_____________

Figure 2: Elle montre la gestion sous Windows
des événements avec du subclassing
En fait, Windows n'envoie plus directement
l'evémenement à VB. Elle passe d'abord par
WindowProc (voir ci-dessous) et ensuite
est appelée la fonction de gestion des
évenement de VB qui va appeler form_click

Un code exemple
---------------

Voici maintenant le code VB avec la fameuse fonction
WindowProc

- Tout d'abord le module -
Il lui faut ajouter les APIs et la constante
mise plus haut (setwindowlong,callwindowproc et gwl_wndproc)
et ajouter d'autres constantes et une variable public
(pour l'ancienne adresse de procédure)

"Public Const WM_LBUTTONDBLCLK = &H203"
"Public Const WM_LBUTTONDOWN = &H201"
"Public Const WM_LBUTTONUP = &H202"
"Public OldProc as long"

Ensuite la fonction qui va démarrer le subclassing
en changeant l'addresse de procédure des événement
et en récupérant l'ancienne addresse de procédure

"sub HookForm1()"
" OldProc = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf WindowProc)"
"End Sub"

Après, la fonction WindowProc qui va être invoquer
à chaque évenement
Remarques: -On utlise select case pour savoir
quelle est l'évenement déclanché
-hwnd renvoie le contrôle ou la fenêtre
d'ou l'evenement à eu lieu, on peut
dont mettre plusieurs fenêtres sur la
même fonction
-Le nom WindowProc peut être changé
-La ligne CallWindowProc est
indispensable, cependant, son
enplacement peut changer(les évenement
VB sont executés lors de l'appel de
cette fonction
-Il existe plein d'autres constantes
d'évenements

"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_LBUTTONDBLCLK"
" Form1.Print "Bouton gauche double click""
" Case WM_LBUTTONDOWN"
" Form1.Print "Bouton gauche enfoncé""
" Case WM_LBUTTONUP"
" Form1.Print "Bouton gauche rélaché""
" End Select"
" WindowProc = CallWindowProc(OldProc, hwnd, uMsg, wParam, lParam)"
"End Function"

Enfin la fonction qui va stopper le subclassing
en réplissant l'ancienne adresse de procédure,
elle doit être appelé avent la destruction de
la fenêtre sinon crash

"Sub UnHookForm1()"
" Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, OldProc)"
"End Sub"

-- La form nommé form1

La sub form_load qui démmarer le subclassing
& met en graphique constant

"Private Sub Form_Load()"
" AutoRedraw = True"
" HookForm1"
"End Sub"

et unload qui termine le subclassing

"Private Sub Form_Unload(Cancel As Integer)"
" UnHookForm1"
"End Sub"

Mais alors !, a quoi ça sert vraiment ?
(form_mouseup,... on connait !)
-------------------------------------

Ceci n'était qu'un exemple pour vous faire
comprendre le principe du subclassing
mais il faut savoir, comme je l'ai dis plus
haut, il existe d'autres constantes
bien plus intérésantes.

Bonne PROG!

Source / Exemple :


' ZIP !!!!!!!!

Conclusion :


Le texte est dans le ZIP en Mieux (ouvrez le avec notepad et affficher le avec une police à écartement fixe)

Codes Sources

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.