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 :

Filtrer les caractères saisis dans un CEdit


Sujet :

MFC

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut Filtrer les caractères saisis dans un CEdit
    Bonjour,

    Pour filtrer les caractères saisis dans un CEdit d'après ce qui j'ai vu sur :
    http://cpp.developpez.com/faq/vc/?pa...eau-d-un-CEdit

    il faut rajouter:

    dans le .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    dans le .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     BEGIN_MESSAGE_MAP(CMyBDlg, CDialogEx)
    	ON_WM_CHAR()
            ...
    END_MESSAGE_MAP()
    dans le .cpp aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     void CMyBDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    if (nChar=='a')  
     
    AfxMessageBox("Touche a enfoncée");
     
    CCMyBDlg::OnChar(nChar, nRepCnt, nFlags); 
    }
    mais j'e vois pas le message "Touche a enfoncée" quand je clique sur le bouton 'a' !

    Alors je ne sais pas ce qu'il manque pour que ça marche ?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 261
    Points
    12 261
    Par défaut
    Vous confondez CDialogEx et CEdit.
    Il va sans dire qu'il faudra générer une classe édit dérivée de la classe CEdit

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Vous confondez CDialogEx et CEdit.
    ah désolé ! quelle erreur !

    Maintenant c'est bon j'ai généré la classe CEditPlus dérivée de la classe CEdit dans le

    CEditPlus.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
     
    #pragma once
    // CEditPlus
     
    class CEditPlus : public CEdit
    {
    	DECLARE_DYNAMIC(CEditPlus)
     
    public:
    	CEditPlus();
    	virtual ~CEditPlus();
     
    protected:
    	DECLARE_MESSAGE_MAP()
    		afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    };
    CEditPlus.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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // EditPlus.cpp*: fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "MyBDlg.h"
    #include "EditPlus.h"
     
     
    // CEditPlus
     
    IMPLEMENT_DYNAMIC(CEditPlus, CEdit)
     
    CEditPlus::CEditPlus()
    {
     
    }
     
    CEditPlus::~CEditPlus()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CEditPlus, CEdit)
    	ON_WM_CHAR()
    END_MESSAGE_MAP()
     
    void CEditPlus::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    if (nChar=='a')  
     
    AfxMessageBox("Touche a enfoncée");
     
    CEditPlus::OnChar(nChar, nRepCnt, nFlags); 
    }
     
    // Gestionnaires de messages de CEditPlus
    Excusez moi mais maintenant comment j'utilise la classe CEditPlus que j'ai crée ?

    Je rajoute ça dans CMyBDlg.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CEditPlus *m_editNumeroDeBonAAnnuler;
    Et puis ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 261
    Points
    12 261
    Par défaut
    C'est le rôle du Class Wizard sur la boite de dialogue qui s'occupera de toute la tuyauterie.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par bacelar Voir le message
    C'est le rôle du Class Wizard sur la boite de dialogue qui s'occupera de toute la tuyauterie.
    Mais j'ai fait ce que j'ai mentionné dans le message précédent et j'intercepte rien pour l'instant !

    je ne sais pas où est le problème? Je pense qu'il faut rajouter quelque chose mais je ne sais pas c'est quoi ?!

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 261
    Points
    12 261
    Par défaut
    Pouvez-vous poster une version minimale qui reproduit le problème ?

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Pouvez-vous poster une version minimale qui reproduit le problème ?
    Bonjour,

    Comme j'ai mentionné dans les messages précédents, j'ai crée un projet type Boite de dialogue et je souhaite intercepter le clique sur le bouton clavier "a" dans un EditBox.
    D'après ce que j'ai vu sur http://cpp.developpez.com/faq/vc/?pa...eau-d-un-CEdit il faut juste utiliser cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void CMyBDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    if (nChar=='a')  
     
    AfxMessageBox("Touche a enfoncée");
     
    CCMyBDlg::OnChar(nChar, nRepCnt, nFlags); 
    }
    Pour cela j'ai crée une classe "CEditPlus" qui dérive de la classe CEdit. Son code est le suivant:
    CEditPlus.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
     
    #pragma once
    // CEditPlus
     
    class CEditPlus : public CEdit
    {
    	DECLARE_DYNAMIC(CEditPlus)
     
    public:
    	CEditPlus();
    	virtual ~CEditPlus();
     
    protected:
    	DECLARE_MESSAGE_MAP()
    		afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    };
    CEditPlus.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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // EditPlus.cpp*: fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "MyBDlg.h"
    #include "EditPlus.h"
     
     
    // CEditPlus
     
    IMPLEMENT_DYNAMIC(CEditPlus, CEdit)
     
    CEditPlus::CEditPlus()
    {
     
    }
     
    CEditPlus::~CEditPlus()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CEditPlus, CEdit)
    	ON_WM_CHAR()
    END_MESSAGE_MAP()
     
    void CEditPlus::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    if (nChar=='a')  
     
    AfxMessageBox("Touche a enfoncée");
     
    CEditPlus::OnChar(nChar, nRepCnt, nFlags); 
    }
     
    // Gestionnaires de messages de CEditPlus
    Et dans le code .h de ma boite de dialogue "CMyBDlg" j'ai déclaré une variable de contrôle comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CEditPlus *m_MyEditBox;
    et je suis bloqué là ! car quand je lance mon programme et je saisi le caractère "a" le message " Touche a enfoncée" ne s'affiche pas sur l'écran, ce que veut dire que j'intercepte rien !

    Alors la question c'est qu est ce que j'ai du oublié dans le code pour que ça ne marche pas ?!

    Merci d'avance

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 261
    Points
    12 261
    Par défaut
    Avez-vous fait l'étape 3 de l'article ci-dessous ?
    https://support.microsoft.com/KB/104637?wa=wsignin1.0

    En particulier le DDX/DDV DDX_Control ?

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Avez-vous fait l'étape 3 de l'article ci-dessous ?
    https://support.microsoft.com/KB/104637?wa=wsignin1.0

    En particulier le DDX/DDV DDX_Control ?
    En effet Quand je rajoute cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DDX_Control(pDX, IDC_MyEDITBOX, m_Myedit );
    ça m'affiche une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     void CMyBDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
     
     // DDX_Control(pDX, IDC_MyEDITBOX, m_MyeditBox );  //  ici  erreur   !!
    }
    parce que j'ai déclaré m_MyeditBox comme pointeur! mais je ne sais pas c'est quoi le rapport ?!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CEditPlus *m_MyeditBox ;

    Et quand je déclare m_MyeditBox comme une variable statique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CEditPlus m_MyeditBox ;
    je n'ai plus d'erreur à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     DDX_Control(pDX, IDC_MyEDITBOX, m_MyeditBox );  // pas  d'erreur
    mais j'ai un problème dans l’utilisation de GetDlgItem !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_MyeditBox =  GetDlgItem(IDC_MyEDITBOX,  ? je ne sais pas quoi mettre ici ? );   //   !!!!
    m_MyeditBox . SetWindowTextA("");
    la syntaxe dit que le 2 eme paramètre doit être : HWND *phWnd mais je l'ai pas compris !

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Utilise la version à un seul paramètre.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Utilise la version à un seul paramètre.
    Pour utiliser la version à un seul paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_MyeditBox =  (CEditPlus*)GetDlgItem(IDC_MyEDITBOX );   //   !!!! m_MyeditBox  est un pointeur de type CEditPlus
    m_MyeditBox . SetWindowTextA("");
    il faut que ma variable de contrôle soit un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CEditPlus *m_MyeditBox ;
    Et si je fais ça j'aurais une erreur ici: !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     void CMyBDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
     
      DDX_Control(pDX, IDC_MyEDITBOX, m_MyeditBox );  //  ici  erreur   !!      Et  Quand je met le curseur sur  m_MyeditBox   il m'affiche ça: 
                                    // CEdit *CMyBDlg::m_MyEditBox
                                   //Error: impossible d'intialiser une référence de type "CWnd &" (non qualifié const) avec une valeur de type "CEdit*"
    }

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ah, j'avais mal vu.
    Le problème, c'est que tu n'est pas censé utiliser GetDlgItem() pour une variable membre contrôle, DDX_Control() suffit normalement.

    Déclare m_MyeditBox comme variable membre normale et tu pourras supprimer la ligne avec GetDlgItem(). Simplement, pense à appeler UpdateData(TRUE) pour que DoDataExchange() soit appelé.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 116
    Points
    116
    Par défaut
    Il y a peut-être plus simple en utilisant l’événement EN_CHANGE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Gestion de la frappe et controle des caractères dans le champs Sound Velocity.
    void CMyDlg::OnChangeField() 
    {
        CString Cur;
        m_cField.GetWindowText(Cur);
        if (Cur.GetLength() > 0) {
            //Faire le test ici sur le dernier caractère de Cur
        }
    }

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 261
    Points
    12 261
    Par défaut
    T'as solution, si elle fonctionne, est lié à une boite de dialogue particulière, pas à un contrôle réutilisable dans n'importe quelle boite de dialogue ou vue MFC.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 116
    Points
    116
    Par défaut
    Effectivement moi je l'utilise que pour quelque CEdit. Mais on peut facilement dériver la classe CEdit et l'intégrer dedans.
    Je m'en sert pour contrôler la saisie de nombre réel (sans utiliser de masque parce que je ne trouve pas ça pratique).

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par coincoin73 Voir le message
    Il y a peut-être plus simple en utilisant l’événement EN_CHANGE
    Mais je ne peux pas utiliser cette solution pour intercepter le clic sur le bouton 'entrée' ou 'supp' par exemple !

Discussions similaires

  1. filtrer un dataCombo selon les caractères saisis
    Par modafine dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 16/12/2008, 15h27
  2. Controle des caractères saisis dans CEdit
    Par FST_PFE dans le forum MFC
    Réponses: 8
    Dernier message: 10/09/2008, 15h15
  3. Réponses: 6
    Dernier message: 14/07/2005, 14h25
  4. Réponses: 8
    Dernier message: 19/05/2005, 16h03
  5. Réponses: 2
    Dernier message: 21/03/2005, 09h03

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