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

MFC Discussion :

Connaitre l'ID d'un objet


Sujet :

MFC

  1. #1
    Membre éclairé Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Points : 656
    Points
    656
    Par défaut Connaitre l'ID d'un objet
    Bonjour.

    J'ai des connaissances assez pointues sur Borland C++ Builder, mais je débute tout juste en VC++ 6.0 MFC par nécessité.

    Je voudrais pouvoir obtenir un pointeur (ou une référence, ou un ID) sur l'objet à l'origine d'un événement.

    Je m'explique. J'ai sélectionné un menu avec pour ID ID_MENU_TEST. Ensuite j'ai créé un événement sur le message COMMAND. Aucun souci, je peux coder, la fonction est bien appelée sans aucun souci.

    Maintenant je voudrais pouvoir affecter le même gestionnaire d'événement sur plusieurs menus différents, et pour effectuer un traitement différent selon le menu appelant. Mais je n'arrive pas à récupérer soit l'ID, soit un pointeur, soit une référence ou que sais-je encore

    Si vous connaissez Borland C++ Builder, les fonctions d'événements sont de la forme nom_fonction(TObject *Sender) {} Sender étant un pointeur sur l'objet appelant. Est-ce qu'il existe la même chose sous VC++ ?

    @+
    Rémi

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    non ce n'est pas possible directement sauf si les id de menu sont consecutifs en utlisera alors la commande ON_COMMAND_RANGE (voir MSDN).
    sinon on peut le faire en intervenant comme suit:
    dans la classe document de l'application rajouter avec classwizard la fonction virtuelle OnCmdMsg:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // a mettre dans le header du document .
    #define WM_SWITCH_ONCMDMENU WM_USER+100 
    #define WM_SWITCH_ONCMDUIMENU WM_USER+101
     
    // source
    /////////////////////////////////////////////////////////////////////////////
    // CTestMdILayoutDoc commands
    BOOL CTestMdILayoutDoc::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
    {
    	// TODO: Add your specialized code here and/or call the base class
        // If pHandlerInfo is NULL, then handle the message	
    	if (pHandlerInfo == NULL)
    	{
            POSITION pos =GetFirstViewPosition();			
    		CView* pView =GetNextView(pos);
    		ASSERT(pView);
            do
            {
    		    if (nCode == CN_COMMAND)
    		    {
    			    // Handle WM_COMMAND message            
                    if(!pView->SendMessage(WM_SWITCH_ONCMDMENU,nID)) break;
    		    }
    		    else if (nCode == CN_UPDATE_COMMAND_UI)
    		    {
    			    // Update UI element stat
                    if(!pView->SendMessage(WM_SWITCH_ONCMDUIMENU,nID,reinterpret_cast<LPARAM>(pExtra))) break;
    		    }	
                return TRUE; 
            }
            while(1);
        }
    	return CDocument::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
    }
    on intercepte les notifications On_Command et On_CommandUI qui sont envoyées a la view active avec un message privé (voir faq).
    si la fonction de retour renvoie 0 le message continue sa route .
    dans la classe fenetre il reste qu'a implementer le message de reception:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    // dans le .h de la view:
    // Generated message map functions
    protected:
    	//{{AFX_MSG(CTestMdILayoutView)
    		// NOTE - the ClassWizard will add and remove member functions here.
    		//    DO NOT EDIT what you see in these blocks of generated code !
    	//}}AFX_MSG
        long OnCommandSwitch(WPARAM wparam,LPARAM lparam); // a rajouter
        long OnCommandUISwitch(WPARAM wparam,LPARAM lparam); // a rajouter
    	DECLARE_MESSAGE_MAP()
     
    // dans le .cpp de la view:
     
    BEGIN_MESSAGE_MAP(CTestMdILayoutView, CFormView)
    	//{{AFX_MSG_MAP(CTestMdILayoutView)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    		//    DO NOT EDIT what you see in these blocks of generated code!
    	//}}AFX_MSG_MAP
    	// Standard printing commands
    	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
     
        ON_MESSAGE(WM_SWITCH_ONCMDMENU, OnCommandSwitch)  // message privé a rajouter manuellement
        ON_MESSAGE(WM_SWITCH_ONCMDUIMENU, OnCommandUISwitch)    // message privé a rajouter manuellement
    END_MESSAGE_MAP()
    //---------------------------------------------
    long CTestMdILayoutView::OnCommandSwitch(WPARAM wparam,LPARAM lparam)
    {
       // 
        int nID=wparam;
        TRACE("\nMenu:%d",nID);
        return 0L;
    }
    //---------------------------------------------
    long CTestMdILayoutView::OnCommandUISwitch(WPARAM wparam,LPARAM lparam)
    {
       // 
        int nID=wparam;
       //   CCmdUI* pCmdUI=reinterpret_cast<CCmdUI*>(lparam);
       //  pCmdUI->Enable();
        return 0L;
    }
    voila ce procédé peut etre incorporé dans des classes pre parametrées ou "templatisé" qui appeleraient directement des fonctions virtuelles dans la view OnCommand(UINT Nid) et OnCommandUI(UINT nid,CCmdUI* pCmd).

Discussions similaires

  1. Connaitre le type d'un objet
    Par Gregory.M dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/03/2008, 16h01
  2. Connaitre les modifications sur les objets
    Par guizmo2025 dans le forum Hibernate
    Réponses: 10
    Dernier message: 07/11/2007, 16h04
  3. Connaitre la taille d'un objet BYTEA
    Par arnaud036 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 21/09/2007, 14h33
  4. Connaitre le type d'un objet
    Par slydemusli dans le forum Access
    Réponses: 5
    Dernier message: 18/08/2006, 11h31
  5. -Debutant-Connaitre le typage d'un objet
    Par Drannor dans le forum Débuter
    Réponses: 10
    Dernier message: 20/06/2006, 01h48

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