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 :

macro MESSAGE MAP et MESSAGE HANDLER


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Par défaut macro MESSAGE MAP et MESSAGE HANDLER
    Bonjour à tous,

    Au fil des exemples, des tuto et de mes tentatives, j'ai découvert la macro VCL_MESSAGE_HANDLER.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN_MESSAGE_MAP
               MESSAGE_HANDLER(Msg, type, fonction)
    END_MESSAGE_MAP
    Cela peut être très utile et m'a notamment permis de créer un genre de OnShow à l'aide du message CM_SHOWINGCHANGED.

    Connaissez vous un un site/lien/endroit où je pourrai trouver une liste de ces "Msg" (en tout cas les plus utiles)?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 049
    Par défaut
    Tu as n'as pas de liste, ils sont déclarés dans les unités qui les utilisent !
    Ce sont des messages internes à la VCL (CM = Custom Message)
    la plupart dans Controls.pas (.hpp)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Pour info il y a egalement une autre technique pour ajouter des messages. C'est la technique du subclassing.
    Le principe est le même sauf que au lieu de passer par BEGIN_MESSAGE_MAP on se branche sur la WndProc directement. Cela permet d'ajouter du code, et c'est aussi une technique très pratique pour modifier le comportement/look d'un composant sans avoir besoin d'écrire une nouvelle classe:

    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
    OnCreate:
    WindowProcStd = WindowProc;
    WindowPro = WindowProcSubclass;
     
    OnDestroy:
    WindowProc = WindowProcStd;
     
    void __fastcall MyForm::WindowProcSubclass(Messages::TMessage &Message)
    {
      switch(Message.msg) {
        case WM_PAINT:
           if (!OnPaint(Message))
              WindowProcStd(Message);
           break;
        default:
           WindowProcStd(Message);
      }
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Par défaut
    Merci à tous les deux pour vos réponses.

    ShaiLeTroll, ton indication est le mustdo du développeur mais la masse de travail qu'elle implique me fait peur (fichier hpp très touffu et long).

    Yarp, j'ai du mal à comprendre ton code, notamment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!OnPaint(Message))
              WindowProcStd(Message);
           break;
    Ou mettre le code sur la modif du paint?

    de plus vue que tu incorpores ta fonction dans la Form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall MyForm::WindowProcSubclass(Messages::TMessage &Message)
    Reprenons l'exemple du show avec M_SHOWINGCHANGED, comment fais-tu la différence entre le show de ta form et le show de ton composant appartenant à la form?


  5. #5
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    Une autre méthode simple pour traiter les messages, redéfinir la fonction liée à l'évènement OnMessage de la fenêtre (ça marche aussi pour l'objet Application). C'est la méthode que j'utilise tout le temps.

    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
     
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      Application->OnMessage = TraiterMessages;
    }
     
    void __fastcall TForm1::TraiterMessages(tagMSG &Msg, bool &Handled)
    {
      if (CM_SHOWINGCHANGED == Msg.message)
      {
       // code de traitement du message
        Handled = true;
      }
    }
    Si tu mets Handled à true, tu dis au gestionnaire de message par défaut que tu l'a traité toi même et qu'il ne doit pas le traiter.
    Si tu n'y touche pas, il reste à false (valeur par défaut à l'entrée dans la fonction TraiterMessages) et le gestionnaire par défaut va le traiter.


    Et encore autre méthode : définir la méthode Dispatch de la fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::Dispatch(void *Message)
    {
      // Intercepte le message 
      if (CM_SHOWINGCHANGED == ((PMessage)Message)->Msg)
      {
       // code de traitement du message
      }
     
      // Appel du gestionnaire par défaut 
      TForm::Dispatch(Message);
    }// fin de Dispatch

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    C'est vrai que j'aurais du mettre un exemple d'évenement plus complet.
    Il faut savoir que les valeurs de retour dun événement changent d'un événement à l'autre. Pour les uns par de valeur de retour, pour d'autre 0 veux dire ok, et pour d'autres 1. Donc il faut regarder au cas par cas sur le site de Microsoft (Msdn) quoi mettre dans Message.Result si besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int _fastcall MyForm::OnEraseBkgnd(Messages::TMessage &Message)
    {
      Message.Result = 1;
      return 1;
    }
    C'est pareil pour un composant de MyForm, ex. un TreeView:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TWndMethod MyTreeProcStd;
     
    MyTreeProcStd = tv->WindowProc;
    tv->WindowProc = MyTreeProcSubclass;
     
    void __fastcall MyForm::MyTreeProcSubclass(Messages::TMessage &Message)
    {
    ...
    Merci Nirgal, je ne connaissais par ces 2 techniques. Plus simples en effet.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Par défaut
    ok Yarp merci pour les précisions ça s'éclaircit énormément avec tes exemples.

    Par contre nirgal76, je vais te faire la même remarque que j'ai fait à Yard tout à l'heure ... :
    Comment fais tu le tri entre les messages adressés à une Form et ceux adressés à combobox, un frame ou tout autre composant VCL... (ou non)

  8. #8
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    Si mes souvenirs sont bons :
    Pour OnMessage (fonction membre de TForm), il ne recevra que les messages destiné à la fenêtre, donc pas de tri, n'arrive que ce qui doit arriver. (messages qui ont été postés pour Form1.Handle. je dis bien posté, par PostMessage. Un message envoyé par SendMessage ne sera pas intercepté par OnMessage).
    Quand à Dispatch, il recoit les messages posté pour l'objet (fonction membre de TObject) pour lequel tu as redéfini Dispatch, donc la aussi pas de tri, n'arrive que ce qui doit arriver.

Discussions similaires

  1. [OL-2010] Macro pour modifier une message avant de le transferer
    Par copainx dans le forum VBA Outlook
    Réponses: 2
    Dernier message: 04/10/2011, 14h56
  2. Réponses: 7
    Dernier message: 30/12/2008, 14h41
  3. Message map avec CObject
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 18/03/2008, 10h53
  4. Réponses: 5
    Dernier message: 12/03/2006, 19h40
  5. [MFC-QT]message map dynamique
    Par farscape dans le forum MFC
    Réponses: 4
    Dernier message: 03/03/2005, 15h33

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