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 :

[MFC] Recuperation ID d'un CEdit


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut [MFC] Recuperation ID d'un CEdit
    Salut

    Voila mon code
    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
     
    void CDerfView::OnButton1() 
    {
    	// TODO: Add your control notification handler code here
    	int i = this->tab.size();
    	this->tab.push_back (i+1);
    	CEdit* pEdit = new CEdit;
    	CPoint pt(147, 14+i*50);
    	CSize sz(87,32);
    	pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
    		CRect(pt, sz), this, this->tab[i]);
    	CString csItem; 
    	csItem.Format("%d",i); 
    	pEdit->SetWindowText(csItem);
    }
    Ceci créé un CEdit dynamiquement en cliquant sur le bouton1.

    Ensuite sur le bouton 2 je veux supprimer un de ces CEdit créé et la ça bloque.
    Je ne trouve pas comment récuperer l'id du CEdit qui a le focus !

    Merci d'avance !

  2. #2
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 102
    Points : 111
    Points
    111
    Par défaut
    La fonction GetDlgCtrlID( ) devrait te rendre ce service ...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Mais est-ce qu'elle prend bien l'id de celui qui est selectionné ?

  4. #4
    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,
    pour le focus faire GetFocus().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nid=GetFocus()->GetDlgCtrlID( );

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Oui mais avec GetFocus, il me renvoie l'id du bouton sur lequel je clique !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CDerfView::OnButton2() 
    {
    	// TODO: Add your control notification handler code here
    	int nid=GetFocus()->GetDlgCtrlID( );
    }
    Il me renvoie l'id du bouton défini dans "ressource.h"

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    En fait, quand je clique sur le bouton 2, je veux que le CEdit auquel j'avais le focus (avant que je clique sur le bouton) soit supprimer !

  7. #7
    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
    re,
    A ce moment la génère une classe derivée de CEdit avec classwizard
    Tu trappes le message KILL_FOCUS dessus,
    et tu envois un mess utilisateur par postmessage à la fenêtre parent avec l’id du contrôle qui a perdu le focus .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetParent()->PostMessage(WM_USER+1,0, GetDlgCtrlID( )) ;
    et surtout tu crées les contrôles dynamiquement avec cette classe au lieu de CEdit.
    et il faudra memoriser dans la classe parent donc le dernier id du controle qui a perdu le focus.


  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Ca je ne sais pas comment le faire !
    Tu trappes le message KILL_FOCUS dessus,
    et tu envois un mess utilisateur par postmessage à la fenêtre parent avec l’id du contrôle qui a perdu le focus .

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Non pardon ça y est !!

    mais j'ai un probleme pour recuperer l'id !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BOOL CDerfView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	this->Cid=GetFocus()->GetDlgCtrlID( );
    	return CFormView::OnNotify(wParam, lParam, pResult);
    }
    et ça marche pas !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Faut-il utiliser getMessage pour recuperer le message envoyé ?
    Si oui, où faut-il le mettre ?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    J'ai mis ça dans ma classe CderfEdit qui herite de Cedit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CDerfEdit::OnKillfocus() 
    {
    	// TODO: Add your control notification handler code here
    	if (GetParent()->PostMessage(WM_USER+1,0,GetDlgCtrlID()) !=0)
    		MessageBox("ok","Erreur",MB_OK);
    }
    Et quand on clique sur les zones de CDerfEdit, il envoie bien les messages mais je ne sais pas comment les recuperer !

    Merci d'avance !

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    j'ai changé le bouton 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CDerfView::OnButton2() 
    {
    	// TODO: Add your control notification handler code here
     
    	MSG msg;
    	GetMessage (&msg,NULL, 0,0);
     
    	CString csItem; 
    	csItem.Format("%d",msg.lParam); 
    	MessageBox(csItem,"Erreur",MB_OK);
    }

    Mais msg.lParam ne renvoie pas l'id de la cedit !

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Personne n'a trouvé mon problème ?

  15. #15
    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,
    Vu que tes contrôles sont crées dynamiquement je te propose cette solution :
    - génère une classe dérive de CEdit avec l’aide de ClassWizard.
    - Dans cette classe intercepte le message reflect =EN_KILLFOCUS
    - Et rajoute les portions de code suivantes :
    .h
    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
     
    typedef struct
    {
    	NMHDR hdr;
    	int		idEdit;	
    }	NMMYEDIT;
     
    #define OPNEDIT_KILLFOCUS 1
     
    class CMyEdit : public CEdit
    {
    // Construction
    public:
    	CMyEdit();
     
    // Attributes
    public:
    	int m_nId;
     
    // Operations
    public:
    	void SetCtrlNotify(int nId=GetDlgCtrlID()){m_nId=nId;}
    	int   GetCtrlNotify(){return m_nId;}
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CMyEdit)
    	//}}AFX_VIRTUAL
     
    // Implementation
    public:
    	virtual ~CMyEdit();
     
    	// Generated message map functions
    protected:
    	//{{AFX_MSG(CMyEdit)
    	afx_msg void OnKillfocus();
    	//}}AFX_MSG
     
    	DECLARE_MESSAGE_MAP()
    };
    .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
    21
    22
    23
    24
    25
    26
    27
     
    CMyEdit::CMyEdit(){m_nId=-1;}
    CMyEdit::~CMyEdit(){}
    BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
    	//{{AFX_MSG_MAP(CMyEdit)
    	ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    void CMyEdit::OnKillfocus() 
    {
    	// TODO: Add your control notification handler code here
    	NMMYEDIT nm;
    if(m_nId==-1)
    {
           nm.hdr.hwndFrom= GetSafeHwnd();
           nm.hdr.idFrom=GetDlgCtrlID();
    }
    else
    {
    		nm.hdr.hwndFrom=GetParent()->GetDlgItem(GetCtrlNotify())->GetSafeHwnd();
    		nm.hdr.idFrom=GetCtrlNotify();
         }
    	nm.idEdit=GetDlgCtrlID();
    	nm.hdr.code=OPNEDIT_KILLFOCUS;
     
    	GetParent()->SendMessage(WM_NOTIFY,nm.hdr.idFrom,(LPARAM)&nm);
    }
    dans la view :
    au lieu d’utiliser la classe CEdit utilise la nouvelle classe.
    Une fois l’edit crée appel la fonction SetCtrlNotify pour specifier le numero d’edit qui recevra toutes les notifications.
    Rajoute le code suivant dans la view.
    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
     
    BEGIN_MESSAGE_MAP(CTestdlgBarMDIView, CFormView)
    	//{{AFX_MSG_MAP(CTestdlgBarMDIView)	
    	//}}AFX_MSG_MAP
    	ON_NOTIFY(OPNEDIT_KILLFOCUS,IDC_EDIT2,OnEditKillFocus) // a rajouter manuellement.
     
    END_MESSAGE_MAP()
    void CTestdlgBarMDIView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	ResizeParentToFit();
    	m_Edit.SetCtrlNotify(IDC_EDIT2);
    	m_Edit2.SetCtrlNotify(IDC_EDIT2);
    	m_Edit3.SetCtrlNotify(IDC_EDIT2);
    }
    void CTestdlgBarMDIView::OnEditKillFocus(NMHDR* pNMHDR, LRESULT* pResult)
    {
    	NMMYEDIT *pnm=(NMMYEDIT *)pNMHDR;
    	TRACE2("\nidorg:%d %d",pnm->idEdit,pnm->hdr.idFrom);
         // Reste a stocker l’id du contrôle qui perd le focus.
    }

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Tu peux m'expliquer pourquoi ça ca marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CDerfView::OnButton2() 
    { 
       // TODO: Add your control notification handler code here 
     
       MSG msg; 
       GetMessage (&msg,NULL, 0,0); 
     
       CString csItem; 
       csItem.Format("%d",msg.lParam); 
       MessageBox(csItem,"Erreur",MB_OK); 
    }

  17. #17
    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
    re,
    pour intercepter ton message utilisateur il faut rajouter une entree dans message_map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ON_MESSAGE(WM_USER+1   ,MessFromEdit)
    // ------------------------------------------------------------------
    LRESULT CDerfView::MessFromEdit(UINT wParam, LONG lParam)
    {
    	return 0L;
    }
    ou utiliser le systeme de notification que j'ai poste avec wm_notify.

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Merci beaucoup ça marche !!!

    encore Merci !!

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 7
    Points
    7
    Par défaut
    Salut

    Un autre truc !

    Quand je clique sur classwizard il me met qu'il y a une erreur sur

    "ON_MESSAGE(WM_USER+1,MessFromEdit)"

    C'est normal ou pas ?

  20. #20
    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
    au lieu de WM_USER+1
    fait un define :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define WM_EDITKILLFOCUS WM_USER+1
    et utilise WM_EDITKILLFOCUS

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [MFC]Recuperation d'un flottant
    Par grozero dans le forum MFC
    Réponses: 1
    Dernier message: 28/04/2005, 17h14
  2. [MFC] Recuperation de la date de modification
    Par lastcheper dans le forum MFC
    Réponses: 3
    Dernier message: 21/04/2005, 17h33
  3. [MFC]Recuperation de variable situé dans un thread
    Par dreamkiller dans le forum MFC
    Réponses: 26
    Dernier message: 05/04/2005, 15h26
  4. [MFC][Debutant] UpdateData, timer et CEdit
    Par Fladnag dans le forum MFC
    Réponses: 2
    Dernier message: 29/01/2004, 06h51
  5. Réponses: 6
    Dernier message: 04/01/2004, 20h59

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