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 :

[CRichEditCtrl] Champ préselectionné


Sujet :

MFC

  1. #1
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut [CRichEditCtrl] Champ préselectionné
    Bonjour à tous,

    j'ai un petit soucis avec un CRichEditCtrl. En effet je créé une CDialog comprenant un CRichEditCtrl et à l'affichage je me rends compte que le texte qu'il contient est sélectionné, bien qu'il n'ai pas le focus ...

    En cherchant un peu dans la doc j'ai trouvé le fonction suivante qui me permet de désélectionner le texte et de placer le curseur au début :
    Je dois bien évidemment faire ceci un seule et unique fois à l'initialisation de mon objet, cependant le faire dans OnInitDialog ne rime à rien vu que l'objet graphique n'est pas encore créé => sans effet. Où dois-je faire mon appel pour qu'il passe une seule et unique fois à l'initialisation ? (bien évidemment je cherche une solution autre qu'un teste pour savoir si j'ai déjà exécuté cette fonction ...)


    PS : j'ai aussi le soucis avec un CComboBox

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    et en retournant FALSE dans OnInitDialog() ?

    en positionnant le focus manuellement bien sur

    @+

  3. #3
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Citation Envoyé par stephdim Voir le message
    et en retournant FALSE dans OnInitDialog() ?

    en positionnant le focus manuellement bien sur

    @+
    ça ne change rien


    EDIT: pour la CComboBox c'est réglé. C'est moi qui m'étais trompé de type : Dropdown au lieu de Drop List.

  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
    Citation Envoyé par TheGzD Voir le message
    cependant le faire dans OnInitDialog ne rime à rien vu que l'objet graphique n'est pas encore créé => sans effet.

    Il me semble bien que GetDltItem dans OnInitDialog fonctionne...
    Après, il faut certainement faire attention avec les UpdateData si tu as une variable associée.

  5. #5
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Ça n'a aucun effet ...

    Ce qui pose problème, à mon avis, c'est que les différents éléments dérivants de CWnd n'ont pas encore de m_hWnd lorsque l'on est dans OnInitDialog.

    Je viens de relire mon 1er post et mon problème y est parfaitement décrit : si quelqu'un voit une solution merci de m'en faire profiter

  6. #6
    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
    Quitte à me répéter, Il me semble bien que GetDltItem dans OnInitDialog fonctionne.
    Peux tu montrer le bout de code de OnInitDialog qui ne semble pas fonctionner ?
    En général, c'est du à un des deux problèmes suivants :
    -> Mauvais identifiant,
    -> dynamic_cast.

  7. #7
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Quitte à me répéter, Il me semble bien que GetDltItem dans OnInitDialog fonctionne.
    j'utilise une variable de contrôle ce qui revient au même (enfin il semble). De plus GetDltItem renvoie un CWnd dont la méthode SetSel n'est pas membre.

    Dernière ligne de mon OnInitDialog avant le return :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->m_note.SetSel(0,0);
    (où m_note est le fameux CRichEditCtrl)

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CRichEditCtr *p_edit = (CRichEditCtr *)GetDlgItem(XXX);
    if(p_edit){
       p_edit->SetSel();
    }
    ...

    Comment assures-tu l'échange avec m_note (à quoi ressemble CTaDialog:: DoDataExchange ) ?

  9. #9
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Pour te faire plaisir j'ai testé le GetDlgItem ce qui n'a eu aucun effet.

    Réponse à ta question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DDX_Control(pDX, IDC_NOTE, m_note);
    Il faut bien que tu comprennes que mon CRichEditCtrl marche parfaitement, mais le texte qu'il contient initialement est entièrement préselectionné.
    J'ai testé par exemple de mettre le SetSel(0,0) dans OnSize : super quand je redimensionne (et pas avant, ce qui est quand meme ce que je voudrais ...) ça met bien le curseur au début du texte, mais si je sélectionne moi-même du texte un redimensionnement le déselectionnera J'espère que tu comprends mieux mon soucis.

  10. #10
    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
    Citation Envoyé par TheGzD Voir le message
    Pour te faire plaisir j'ai testé le GetDlgItem ce qui n'a eu aucun effet.

    Réponse à ta question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DDX_Control(pDX, IDC_NOTE, m_note);
    Il faut bien que tu comprennes que mon CRichEditCtrl marche parfaitement, mais le texte qu'il contient initialement est entièrement préselectionné.
    J'ai testé par exemple de mettre le SetSel(0,0) dans OnSize : super quand je redimensionne (et pas avant, ce qui est quand meme ce que je voudrais ...) ça met bien le curseur au début du texte, mais si je sélectionne moi-même du texte un redimensionnement le déselectionnera J'espère que tu comprends mieux mon soucis.
    Ok, CRichEditCtrl doit avoir une autre initialisation à la c.. qui écrase ta précédente sélection. Tiens, fais un test : mets un point d'arrêt à DoDataExchange et un autre à la fin de OnInitDialog ? L'idée est de voir si on passe par DoDataExchange après OnInitDialog et avant que tu fasses autre chose. Il se pourrait que ce soit à ce moment que la préselection s'opère.

  11. #11
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Ok je viens de tester ce que tu proposes et DoDataExchange a bien lieu avant OnInitDialog.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 463
    Par défaut
    Pouvez-vous vérifier avec un GetSafeHwnd si la fenêtre (objet Kernel de Windows "m_hwnd", pas la classe MFC) est déjà créée.
    Si c'est faux, vérifiez que votre code est situé après l'appel à la méthode de la classe de base.
    Si c'est vrai, vérifiez avec un point d'arrêt sur une redéfinition de la méthode de "SetSel" qui change la sélection et pourquoi.
    Je ne sais pas si un CRichEditCtrl envoie des messages de notifications (EN_XXX) à sa fenêtre parente, mais si c'est le cas, il serait judicieux de les intercepter pour connaître le pourquoi du comment.

  13. #13
    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
    Je sèche : je ne vois plus que la bidouille : t'envoyer (par post et non send) un message à la fin de OnInitDialog ou faire un timer de qqs ms ?

  14. #14
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Si c'est faux, vérifiez que votre code est situé après l'appel à la méthode de la classe de base.
    je dois avouer que je n'ai pas compris ce que tu veux dire là

  15. #15
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    J'ai trouvé ce qui n'allait pas : c'était le seul élément de ma dialog à avoir sa propriété Tabstop à true. Je présume que ça lui faisait systématiquement obtenir le 1er focus d'où la préselection. En mettant la propriété d'un autre item à true aussi et en faisant passer cet item avant dans le liste de tab le problème n'est plus.

  16. #16
    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
    Citation Envoyé par TheGzD Voir le message
    J'ai trouvé ce qui n'allait pas : c'était le seul élément de ma dialog à avoir sa propriété Tabstop à true. Je présume que ça lui faisait systématiquement obtenir le 1er focus d'où la préselection. En mettant la propriété d'un autre item à true aussi et en faisant passer cet item avant dans le liste de tab le problème n'est plus.
    Tiens. C'est bizarre. Pourquoi la solution proposée par stephdim n'a pas fonctionner ?

  17. #17
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Parce qu'à mon avis cette prise de focus se passe, comme tu l'avais un supposé, après le OnInitDialog donc je pouvais bien faire ce que je voulais dans cette méthode ...

  18. #18
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    regarde ici : http://support.microsoft.com/kb/83302/en-us

    à la rubrique DLGC_HASSETSEL

    An edit control returns a value that includes the DLGC_HASSETSEL code to indicate that Windows should select all the text in an edit control when the control receives the input focus through the tabbing sequence.
    faut juste faire en sorte que WM_GETDLGCODE de ton edit ne retourne pas ce bit ... en subclassant ...

    PS: pour info, dans OnInitDialog, les controles enfants sont tous créés.
    si tu utilises des DDX_Control, assure toi d'appeler le OnInitDialog de la classe mère avant. (c'est là qu'est appelé le DoDataExchange )

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/09/2013, 14h18
  2. Réponses: 4
    Dernier message: 08/09/2009, 09h49
  3. [ADO] Constantes des types de champ
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/09/2002, 11h08
  4. Taille des champs proportionnelle...
    Par Depteam1 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/08/2002, 11h48
  5. taille max du nom d'un champ
    Par hna dans le forum Paradox
    Réponses: 2
    Dernier message: 28/07/2002, 02h40

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