IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Capturer l'évènement onPaint d'un TLabel


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Capturer l'évènement onPaint d'un TLabel
    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

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    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

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    J'en suis pas certain, mais je pense qu'il faudrait dériver d'un TLabel
    et surcharger la méthode Paint (????).

    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.
    D'où mon doute ! Faut tester !

    A plus !

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Ah oui je pense que c'est faisable et même plus simple que les Hook !
    Bonne idée
    Neilos

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Et comment je fais pour deriver la methode Paint() du TLabel, puisque je ne trouve pas cette methode ?

    merci

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Voici quelque chose qui semble fonctionner avec ma version BCB 3 Pro :

    //le .h
    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();
    };
    //le .cpp

    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
    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;
    }
    A plus !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    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.


    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:  }
    Le problème se situerai à la ligne 9, d'après le débogueur de Borland C++ Builder 6.
    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

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classes::TWndMethod OldLabel1WndProc;
    Et au niveau de la création de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    OldLabel1WndProc = Label1->WindowProc;
    Label1->WindowProc = Label1WndProc;
    Et à la ligne 9, il suffisait de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OldLabel1WndProc(Message);
    Voilà,
    et merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#]capture des événements
    Par gorgonite dans le forum C#
    Réponses: 7
    Dernier message: 12/01/2007, 22h44
  2. capturer un événement souris
    Par doc_nounours dans le forum Windows
    Réponses: 8
    Dernier message: 22/11/2006, 10h56
  3. Réponses: 6
    Dernier message: 20/04/2006, 15h44
  4. Pb de capture d'évènement dans un JTextArea!
    Par scooby09 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 18/03/2006, 21h24
  5. Réponses: 5
    Dernier message: 21/12/2004, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo