Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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 229 / 478

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de OphidiaN le 23/07/2002 20:26:42

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

signaler à un administrateur
Commentaire de DebvbJ le 24/07/2002 01:54:13

Ouai c pas mal, c utile en tout cas !

signaler à un administrateur
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?

signaler à un administrateur
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

@++

signaler à un administrateur
Commentaire de cedrigoler le 24/07/2002 19:25:54

Felicitation pour ce super article !!

signaler à un administrateur
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 ...

signaler à un administrateur
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...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.