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] Poster un caractère dans un CEdit au niveau du curseur


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut [MFC] Poster un caractère dans un CEdit au niveau du curseur
    Bonjour,

    Pour écrire le caractère 'A' dans un contrôle CEdit, j'utilise le code :

    pEdit->PostMessage(WM_CHAR,'A');

    Mon problème est que ce 'A' s'affiche en tête.
    Or je voudrais qu'il s'insère à la position du curseur.
    Comment faire ?
    Merci d'avance

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 303
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Si j'ai bien compris ta question, ceci devrais fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CString strBuffer = pEdit->GetWindowText(); //récupère le contenu du CEdit
    pEdit->SetWindowText(strBuffer+"A"); //insère "A" à la fin
    Hope it helps.

  3. #3
    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
    Par défaut
    salut,
    eventuellement avec un pEdit->SetSel(0,0) avant le postmessage.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Oui, tu as bien compris la question, sauf que je veux écire la caractère à la position du curseur du CEdit.

  5. #5
    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
    Par défaut
    moué bizarre .
    que renvoie GetSel (nStartChar et nEndChar )?

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 303
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Hepm
    Oui, tu as bien compris la question, sauf que je veux écire la caractère à la position du curseur du CEdit.
    Arf, je ne suis pas sûr d'avoir biezn compris Pourrais-tu donner un exemple?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Malheureusement, GetSel ne me renvoie rien d'intéressant :
    j'obtiens 0 et le nombre de caractères de la chaîne du CEdit.
    Je n'obtiens pas la position du curseur (que j'aimerai bien récupérer).

    C'est peut-être parce que je poste à partir d'une fonction OnButton() appelée par un clic sur un bouton ??

    Donc, la question est : comment récupérer DebutSel et FinSel ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Citation Envoyé par r0d
    Arf, je ne suis pas sûr d'avoir biezn compris Pourrais-tu donner un exemple?
    C'est vrai que je n'ai pas été très clair! Bon, alors j'explique tout :

    J'ai une CDialog comportant un CComboBox et des boutons qui doivent servir de touches (genre calculatrice).

    Quand j'appuie sur Button0, ça lance OnButton0() que j'avais initialement écrite ainsi :

    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 CSaisieExpression::OnButton0()
    //Insère un '0' dans la chaîne du ComboBox
    {
    	CComboBox* pEdit = (CComboBox*) GetDlgItem(IDC_COMBO1);
    	pEdit->SetFocus();
    	DWORD Selection = pEdit->GetEditSel();
    	int Debut = Selection & 0xFFFF;//partie basse de Selection
    	int Fin = (Selection >> 16) & 0xFFFF;//partie haute de Selection
    	CString Ch;
    	pEdit->GetWindowText(Ch);
    	Ch.Delete(Debut, Fin-Debut);//suppression partie sélectionnée
    	Ch.Insert(Debut, '0');
    	pEdit->SetWindowText(Ch);
    }
    Mon problème, c'est que j'obtiens toujours Debut = 0 et Fin = Nombre de caractères de la chaîne.

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 303
    Billets dans le blog
    2
    Par défaut
    Il me semble que le SetFocus est inutile. Que se passe-t-il si tu l'enlève?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Citation Envoyé par r0d
    Il me semble que le SetFocus est inutile. Que se passe-t-il si tu l'enlève?
    C'était bien aussi mon avis. Mais dans ce cas, Selection me retourne 0 (quel que soit la sélection).

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Je pense avoir (enfin ) compris l'origine de mes problèmes.
    Il semble que la sélection dans un Edit soit "volatile", dans le sens où les données qui la définissent sont perdues dès que l'Edit perd le Focus.
    Ainsi, dans mon cas, dès que je clique sur un bouton, l'Edit perd le Focus et GetEditSel() me retourne la valeur 0.

    J'ai donc imaginé la parade suivante :
    j'utilise deux membres m_DebutSel et m_FinSel qu'il faut que j'initialise avant que l'Edit perde le Focus avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void CSaisieExpression::OnMouseMove(UINT nFlags, CPoint point) 
    {
    	CComboBox* pEdit = (CComboBox*) GetDlgItem(IDC_COMBO1);
    	DWORD Selection = pEdit->GetEditSel();
    	m_DebutSel = LOWORD(Selection);
    	m_FinSel = HIWORD(Selection);
     
    	CDialog::OnMouseMove(nFlags, point);
    }
    Ensuite, j'ai une fonction appelée par mes boutons qui va modifier l'Edit :

    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
     
    void CSaisieExpression::InsereDansEdit(CString Ch)
    //Insère Ch dans la chaîne de l'Edit du ComboBox
    //Position d'insertion définie par les membres de Sélection
    {
    	//Récupération de la chaîne de l'Edit
    	CComboBox* pEdit = (CComboBox*) GetDlgItem(IDC_COMBO1);
    	CString ChEdit;
    	pEdit->GetWindowText(ChEdit);
     
    	//Remplacement de la chaîne sélectionnée dans l'Edit par Ch
    	ChEdit.Delete(m_DebutSel, m_FinSel-m_DebutSel);
    	ChEdit.Insert(m_DebutSel, Ch);
    	pEdit->SetWindowText(ChEdit);
     
    	//Actualisation des membres de Sélection
    	m_DebutSel += Ch.GetLength();
    	m_FinSel = m_DebutSel;
     
    	//Mise à jour de la Sélection dans l'Edit
    	pEdit->SetFocus();
    	pEdit->SetEditSel(m_DebutSel,m_FinSel);
    }
    Bon, il y a peut-être une solution plus simple. Merci alors de me le dire.

  12. #12
    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
    Par défaut
    salut,
    au lieu de onMouseMove ,j'utiliserais WM_KILLFOCUS.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    J'ai essayé d'utiliser WM_KILLFOCUS qui m'a paru effectivement plus adapté :
    ma solution avec OnMouseMove() n'étant qu'un moyen détourné.

    Malheureusement, je n'arrive pas à intercepter WM_KILLFOCUS quand mon Edit perd le focus : je l'ai contrôlé en mettant un point d'arrêt dans OnKillFocus(CWnd* pNewWnd).

    En fait, j'intercepte WM_KILLFOCUS seulement quand je ferme la CDialog contenant mon Edit.

    L'idéal serait que je puisse intercepter un message juste avant que mon Edit perde le focus.

    Et ça, je ne sais pas si c'est possible...

Discussions similaires

  1. [MFC] Problème d'insertion du caractère ' dans une BD
    Par julien.nasser dans le forum MFC
    Réponses: 5
    Dernier message: 21/04/2006, 09h46
  2. [MFC] Insertion d'une chaine de caractère dans une BD
    Par julien.nasser dans le forum MFC
    Réponses: 2
    Dernier message: 20/04/2006, 15h19
  3. Réponses: 2
    Dernier message: 01/03/2006, 21h34
  4. Réponses: 7
    Dernier message: 16/11/2004, 15h45
  5. [MFC] Retour à la ligne dans un CEdit
    Par Kant dans le forum MFC
    Réponses: 7
    Dernier message: 18/02/2004, 08h58

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