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

Soyez le premier à donner votre avis sur cette source.

Vue 5 189 fois - Téléchargée 619 fois

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

A voir également

Ajouter un commentaire Commentaires
Messages postés
14
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
30 décembre 2006

Merci beaucoup! en plus d'être utile cet article montre bien qu'avec VB on peut faire des trucs avancés comme le C!

Très instructif!

Bonne continuation à toi!
Messages postés
340
Date d'inscription
jeudi 25 juillet 2002
Statut
Membre
Dernière intervention
25 août 2007

le seul hic a ce genre de catch des events via le subclassing c'est que tu retrouve le control via son handle donc tu ne peut pas recuperer les events des controls windowsless comme un label par exemple donc c dommage sinon ca fonctionne tres bien avec tous les autres controls
(au pire il suffit de recreer un control label (voir les sources de Renfield) qui possede un hwnd et le tour et joué :p
j'y avais pensé aussi pour un logiciel de script mais j'ai choisi une autre vois plus longue mais plus simple a mettre en oeuvre ...
Messages postés
35
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
6 mai 2005

Felicitation pour ce super article !!
Messages postés
18
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
8 mars 2004

Je l'ai oublieé de le préciser

Les constanes peuvent se trouver dans la visionneuse d'APIs
Pour les fenêtres, elle commencent tous par WM_

Sinon, SPY++ , (sur le CD VB6), on peut lister les évenements d'une et une il y a une liste complète des constantes des messages

On peut également rechercher dans MSDN (! dans TOUT MSDN) en anglais

@++
Messages postés
30
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
31 janvier 2007

Est-ce que tu sais où peut-on trouver la liste des messages (liste des constantes et leurs significations) qu'on pourrait intercepter par le subclassing?
Afficher les 8 commentaires

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.