Bonjour,
Comment pourrais-je capturer l'évènement onPaint d'un TLabel sous Borland C++ Builder 6, sachant que l'évènement n'existe pas dans l'inspecteur d'objet.
Merci
Bonjour,
Comment pourrais-je capturer l'évènement onPaint d'un TLabel sous Borland C++ Builder 6, sachant que l'évènement n'existe pas dans l'inspecteur d'objet.
Merci
Avec des Hook je pense.
Fais une recherche sur developpez.com ou sur google.
Je n'ai pas d'information plus précises, désolé.
Neilos
Salut !
J'en suis pas certain, mais je pense qu'il faudrait dériver d'un TLabel
et surcharger la méthode Paint (????).
D'où mon doute ! Faut tester !Paint est appelée automatiquement quand le libellé reçoit un message WM_PAINT
de son Parent. Paint écrit le texte renvoyé par la méthode GetLabelText.
A plus !
Ah oui je pense que c'est faisable et même plus simple que les Hook !
Bonne idée
Neilos
Et comment je fais pour deriver la methode Paint() du TLabel, puisque je ne trouve pas cette methode ?
merci
Salut !
Voici quelque chose qui semble fonctionner avec ma version BCB 3 Pro :
//le .h
//le .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class JMyLabel : public TLabel { public : __fastcall JMyLabel(TComponent *Owner); __fastcall ~JMyLabel(); void __fastcall Paint(); };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 __fastcall JMyLabel::JMyLabel(TComponent *Owner) : TLabel(Owner) { } __fastcall JMyLabel::~JMyLabel() { } void __fastcall JMyLabel::Paint() { //on intercepte ici //.. TLabel::Paint(); //appel de la méthode Paint héritée //ou bien on intercepte ici //.. }
Donc pour tester je me suis contenté de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part JMyLabel *TheLabel;A plus !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { JMyLabel *TheLabel = new JMyLabel(this); TheLabel->Parent = this; TheLabel->Caption = "Coucou!"; TheLabel->Left = 20; TheLabel->Top = 60; TheLabel->Width = 80; TheLabel->Height = 24; }
Seulement, je serais obligé d'initialiser le controle à partir du code, et je ne pourrais pas le placer à partir du concepteur de fiches.
Alors voila, j'ai réussi à surcharger la fonction qui gère les évènements du controle (avec la propriété WindowProc qui enregistre le pointeur sur la fonction de gestion des messages), mais il y a un nouveau problème, une erreur à la fermeture de l'application EStackOverFlow.
Le problème se situerai à la ligne 9, d'après le débogueur de Borland C++ Builder 6.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 1: //Lors de la création de la fenêtre 2: Label1->WindowProc = Label1WndProc; 3: 4: //Ma fonction de gestion des évènements de mon Label1 5: void __fastcall Label1WndProc(TMessage &message) { 6: if(message.message == WM_PAINT) 7: // Gestion de mon dessin 8: else 9: Form1->WndProc(message); 10: }
Et donc, pourquoi cette erreur ?
Si j'enlève le renvoie du message par WndProc(), il n'y a plus d'erreur, mais les évènemnts autres que PAINT définie à partir de l'esplorateur de propriétés ne fonctionnent plus.
Merci
C'est bon j'ai trouvé
Il s'agissait de rappeler l'ancienne fonction que pointait la propriété WindowProc.
Il fallait donc enregistrer l'ancienne fonction dans une variable :
Et au niveau de la création de la forme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Classes::TWndMethod OldLabel1WndProc;
Et à la ligne 9, il suffisait de mettre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 OldLabel1WndProc = Label1->WindowProc; Label1->WindowProc = Label1WndProc;
Voilà,
Code : Sélectionner tout - Visualiser dans une fenêtre à part OldLabel1WndProc(Message);
et merci à tous
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager