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 :

Comment recuperer les msg d'une CListCtrl cree dynamiquement?


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut Comment recuperer les msg d'une CListCtrl cree dynamiquement?
    Hello,
    j'ai un dialog en vc++ qui comprend un CListCtrl, je recupere les actions (click, click droit,etc) de cette liste grace à ON_NOTIFY(NM_CLICK, IDC_LIST2, <NomDeRoutine>) dans //{{AFX_MSG_MAP(CTestListe).
    Jusque la, ça va bien.
    Maintenant, j'ai un dialog vide et je construis dynamiquement la CListCtrl avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_Liste = new CListCtrl;
    VERIFY (m_Liste->Create (WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_EDITLABELS, CRect (10, 10, 300, 300), this, IDI_LIST));
    Si je fais un ON_NOTIFY(NM_CLICK, IDI_LIST, <NomDeRoutine>) j'ai 2 erreurs de compil au niveau de la ligne ON_NOTIFY :
    - error C2065: '<NomDeRoutine>' : undeclared identifier
    - error C2440: 'type cast' : cannot convert from 'int *' to 'void (__thiscall CCmdTarget::*)(struct tagNMHDR *,long *)'
    Comment je fais pour recuperer les actions et associer la bonne routine en fonction du type de message??

    D'avance merci
    DD

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,
    Tu n'as probablement pas déclaré et définie ta routine <NomDeRoutine> dans ta classe CTestListe.
    A noter que si l'ID de ton contrôle est dynamique, alors il faut surcharger CWnd::OnNotify et rediriger le traitement en fonction de cet ID.
    Cordialement.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut Bien joué !
    Merci de ta réponse!
    C'est tout à fait ça, je m'étais loupé en faisant mes copier/coller et j'étais allé le mettre dans la classe CAboutDlg définie juste au-dessus!
    ça marche beaucoup mieux maintenant!
    Par contre je ne suis pas sur d'avoir bien compris ta phrase suivante : <<il faut surcharger CWnd::OnNotify et rediriger le traitement en fonction de cet ID.>>...
    Mon ID n'est pas vraiment dynamique, je le défini en dur au début de mon prog, c'est la seule façon que j'ai trouvé de faire ça, même si ça me plait moyen...
    Y a t-il une autre façon de faire?
    D'avance et encore merci.
    Cordialement.
    DD

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Une autre façon de faire est (je fais à la volée donc modulo les erreurs) peut ressembler à ça:
    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
    CMyDialog::OnInitDialog()
    {
    ...
       m_Liste = new CListCtrl;
       m_idListe = IDI_LIST;// Ici, au lieu d'utiliser une constante, tu peux la générer.
       VERIFY (m_Liste->Create (WS_VISIBLE | WS_CHILD | LVS_REPORT |    LVS_EDITLABELS, CRect (10, 10, 300, 300), this, m_idListe));
    ...
    }
    BOOL CMyDialog::OnNotify(   WPARAM wParam, 
       LPARAM lParam, 
       LRESULT* pResult  
    )
    {
       NMHDR *p_notification = (NMHDR *)lParam;
       if(p_notification){
            switch(p_notification->idFrom)
            {
                  case m_idListe:
                        return TraiterMaListe(p_notification);
            }
       }
       return CDialog::OnNotify(wParam,lParam,pResult);
    }
    BOOL TraiterMaListe(NMHDR *_Notification)
    {
         switch(_Notification->code)
         {
                case NM_CLICK:
                       OnClickListe(_Notification);
                       return TRUE;
                break;
               .....
         }
         return FALSE;
    }

Discussions similaires

  1. REXX comment recuperer les lignes d'une commande TSO
    Par jrlamendin dans le forum z/OS
    Réponses: 2
    Dernier message: 19/03/2009, 19h27
  2. Réponses: 2
    Dernier message: 24/08/2007, 14h25
  3. Réponses: 3
    Dernier message: 19/10/2006, 09h47
  4. [ODBC/Interbase] Comment récupérer les données d'une table ?
    Par etiennegaloup dans le forum Accès aux données
    Réponses: 3
    Dernier message: 27/09/2006, 08h55
  5. Comment recuperer les info d'un formulaire dans une boite de dialogue
    Par frutix dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/05/2006, 11h42

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