begin process at 2012 02 16 14:30:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > LE SUBCLASSING : UNE AUTRE FAÇON POUR LES ÉVÉNEMENTS

LE SUBCLASSING : UNE AUTRE FAÇON POUR LES ÉVÉNEMENTS


 Information sur la source

Note :
9,2 / 10 - par 5 personnes
9,20 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Expert Date de création :23/07/2002 Date de mise à jour :23/07/2002 16:54:19 Vu / téléchargé :3 884 / 510

Auteur : vbmore

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 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!


 Conclusion

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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

OBTENIR À L'AVANCE LA TAILLE D'UN TEXTE DESSINÉ SUR UNE FORM...
UN SIMPLE PROGRAMME MULTI-THREAD
COPIER UNE STRUCTURE "TYPE" DANS UNE AUTRES
IMPRIMER N'IMPORTE QUEL FICHIER
Source avec Zip EVENT QUAND LA FORM BOUGE (SUBSCLASSING)

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

Commentaires et avis

Commentaire de olidbc le 23/07/2002 20:23:59

bel article,

je me suis justement pris la tete avec ca il y a quelques jours pour en compredre le fonctionnent. ton article a m'aurai fait gagner un peu de temp :)


j'ajouterai juste que le subclassing permet aussi de pouvoir utiliser des fonctions API avec callback dans un module de classe. car en vb, on ne peu utliser la fonction 'AddressOf' permettant de renvoyer le pointeur d'une fonction que dans une module (tout court).

Olivier.

Commentaire de OphidiaN le 23/07/2002 20:26:42

ouah c trop fort en effet ça....

Commentaire de DebvbJ le 24/07/2002 01:54:13

Ouai c pas mal, c utile en tout cas !

Commentaire de Luong le 24/07/2002 11:53:54

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?

Commentaire de vbmore le 24/07/2002 12:27:49

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

@++

Commentaire de cedrigoler le 24/07/2002 19:25:54

Felicitation pour ce super article !!

Commentaire de shadowmoy le 25/01/2004 17:07:08

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 ...

Commentaire de JoNasx86 le 16/11/2006 22:53:51

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!

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,296 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales