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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 089
    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 089
    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
    924
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 924
    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)

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