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
Version imprimable
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
Bonjour,
Si j'ai bien compris ta question, ceci devrais fonctionner:
Hope it helps.Code:
1
2 CString strBuffer = pEdit->GetWindowText(); //récupère le contenu du CEdit pEdit->SetWindowText(strBuffer+"A"); //insère "A" à la fin
salut,
eventuellement avec un pEdit->SetSel(0,0) avant le postmessage.
:D
Oui, tu as bien compris la question, sauf que je veux écire la caractère à la position du curseur du CEdit.
moué bizarre .
que renvoie GetSel (nStartChar et nEndChar )?
:D
Arf, je ne suis pas sûr d'avoir biezn compris :oops: Pourrais-tu donner un exemple? :oops:Citation:
Envoyé par Hepm
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 ?
C'est vrai que je n'ai pas été très clair! Bon, alors j'explique tout :Citation:
Envoyé par r0d
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 :
Mon problème, c'est que j'obtiens toujours Debut = 0 et Fin = Nombre de caractères de la chaîne.Code:
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); }
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).Citation:
Envoyé par r0d
Je pense avoir (enfin :D) 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 :
Ensuite, j'ai une fonction appelée par mes boutons qui va modifier l'Edit :Code:
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); }
Bon, il y a peut-être une solution plus simple. Merci alors de me le dire.Code:
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); }
salut,
au lieu de onMouseMove ,j'utiliserais WM_KILLFOCUS.
:D
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. :P
Et ça, je ne sais pas si c'est possible...8O