|
|||
Fermer
GERER LES MESSAGES WINDOWSWndProcINTERCEPTION DES MESSAGES DESTINES A UNE FENETRE OU UN COMPOSANT: Dernière mise à jour : 27/09/03
Utilisation de WndProc Messages destinés la "Form" principale Nous allons surcharger la méthode WindProc de base : Dans la partie private de notre Form principale, ajoutons la déclaration suivante: private procedure WndProc(var msg : TMessage); override;
Puis dans la partie implementation ajoutons l'implémentation de notre procédure : procedure TForm1.WndProc(var msg : TMessage); begin if (msg.msg=WM_RBUTTONDOWN) then ShowMessage('Message reçu par WndProc:WMRButtonDown (clique bouton droit)'); inherited WndProc(msg);// si l'on veut que le message continue à se propager end; On notera également que le message msg est passé par adresse (var) on peut donc modifier son contenu avant d'appeler inherited WndProc. Lancez votre programme : Si vous cliquez sur la Form à l'aide du bouton droit, votre ShowMessage se déclenchera. Si vous cliquez sur un composant (par exemple un panel) situé sur votre Form, le ShowMessage ne se déclenchera pas car il concerne la Form1 et non le panel1.
Messages destinés, par exemple à un panel situé sur la "Form" Dans la partie private de la déclaration de la Form1 ajoutez : private OldProc : TWndMethod; procedure PanelProc(var msg : TMessage);; puis dans l'événement OnCreate de la Form1 ajoutez: procedure TForm1.FormCreate(Sender: TObject); begin // Sauvegarde de la WndProc actuelle de Panel1 OldProc := Panel1.WindowProc; // Affecter une nouvelle procédure de fenêtre Panel1.WindowProc := PanelProc; end;
Ainsi, à la création nous sauvons la procédure WndProc du panel1(qui est donnée par la propriété WindowProc du panel1) dans OldProc de type TWndMethod puis, nous remplaçons l'ancien WndProc du panel1 par PanelProc.
Il nous reste à implémenter notre procédure PanelProc. Par exemple : procedure TForm1.PanelProc(var msg : TMessage); begin // interception de WM_RBUTTONDOWN if (msg.msg=WM_RBUTTONDOWN) then begin ShowMessage('Message reçu par Panel1Proc:WMRButtonDown (clique bouton droit).' +'Il sera transmis à la WndProc de Form1'); // Transfert du message WM_RBUTTONDOWN à WindowProc de Form1 Perform(Msg.msg,Msg.WParam,Msg.LParam);//Perform répond comme si Form1 avait reçu //le message Windows spécifié par Msg.msg. Exit;//sortie de la procédure end; OldProc(msg);// Procédure WndProc standard (celle que l'on avait sauvegardée) //pour les autres messages end; |