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
Version imprimable
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é.
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 !Citation:
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 :bravo:
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 .cppCode:
1
2
3
4
5
6
7 class JMyLabel : public TLabel { public : __fastcall JMyLabel(TComponent *Owner); __fastcall ~JMyLabel(); void __fastcall Paint(); };
Code:
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:JMyLabel *TheLabel;
A plus !Code:
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:
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é :P
:arrow: Il s'agissait de rappeler l'ancienne fonction que pointait la propriété WindowProc.
:arrow: Il fallait donc enregistrer l'ancienne fonction dans une variable :
:arrow: Et au niveau de la création de la forme :Code:Classes::TWndMethod OldLabel1WndProc;
:arrow: Et à la ligne 9, il suffisait de mettre :Code:
1
2
3 OldLabel1WndProc = Label1->WindowProc; Label1->WindowProc = Label1WndProc;
Voilà,Code:OldLabel1WndProc(Message);
et merci à tous