2 votes

Visual Studio MFC change le texte dans le contrôle d'édition pendant la saisie/dynamique

J'essaie de mettre en place une application MFC C++ dans Visual Studio 2019 qui modifie le texte de l'utilisateur au fur et à mesure qu'il tape.

La présentation actuelle est constituée de 2 boutons radio,

ID= rdbOn (réglé sur Groupe = True avec la variable Value int m_isOn = 1 )

ID= rdbOff , m_isOn serait = 0

Layout

et 1 contrôle d'édition, ID= txtInputBox , avec Valeur CString variable m_inputString

Actuellement, pour les tests, je peux voir comment cela fonctionnerait pour un bouton sur le clic, cela prendrait quelque chose comme ce qui suit et juste SetDlgItemText du résultat. Mais ce serait après qu'ils aient tapé, et non pendant qu'ils tapent.

void Onsomebtnclick()
{
    //convert CString to String of m_inputString
    //do some string manipulation
    //convert back to CString
    //SetDlgItemText(txtInputBox, result)    
}

Mise à jour : a EN_CHANGE travailler J'ai pu obtenir EN_CHANGE en travaillant avec le drapeau suggéré par l'utilisateur @GoGoWorx. Cependant, j'ai maintenant un léger problème avec le curseur qui revient au début du contrôle d'édition. txtInput .
Je lis qu'il est possible d'utiliser un CEdit::SetSel mais je ne sais pas comment l'utiliser directement dans mon code. J'ai essayé Contrôle CEdit MFC, placer le curseur à la fin de la chaîne après SetWindowText

someDlg::someFunction()
{
    //some logic stuff to get a result string
    SetDlgItemText(txtInputBox, result);
    //need it to set the cursor to the end
    //I tried these, but it didn't recognize (expression must have class type?)
    //txtInputBox.SetSel(0, -1);
    //txtInputBox.SetSel(-1);
}

3voto

GoGoWorx Points 161

Il semble que vous deviez utiliser la fonction ON_EN_CHANGE notification de la carte des messages (appelée après que le contrôle a été mis à jour à la suite d'une saisie ou d'un collage, par exemple)

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)   
    ON_EN_CHANGE(IDC_EDIT_CONTROL, &CMyDialog::OnEnChangeEditControl)
END_MESSAGE_MAP()

void CMyDialog::OnEnChangeEditControl()
{
   // Copy or call your Onsomebtnclick() here
}

Je ne suis pas sûr de ce que vous utilisez pour l'identifiant numérique du contrôle d'édition, étant donné qu'il s'agit généralement de définitions en majuscules - remplacer IDC_EDIT_CONTROL ci-dessus avec votre définition (éventuellement txtInputBox mais, là encore, il s'agit normalement de majuscules Je ne suis donc pas sûr).

Modifier également CMyDialog pour le nom de votre classe de dialogue.

Notez que nous utilisons l'option ON_EN_CHANGE au lieu du gestionnaire de messages ON_EN_UPDATE , puisque le ON_EN_CHANGE le message est envoyé après le contrôle a été mis à jour, tandis que ON_EN_UPDATE est appelé juste antes de il est mis à jour.

Les gestionnaires de cartes de messages sont décrits dans le document Remarques de la section CEdit la documentation de contrôle : https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160

En ce qui concerne votre souci de modifier les choses au fur et à mesure que l'utilisateur tape, cela devrait aller, puisque chaque changement (frappe de touche ou collage à partir du presse-papiers, etc.) devrait déclencher l'appel de ce gestionnaire, dans lequel vous pouvez modifier ce dont vous avez besoin. Assurez-vous simplement que lorsque vous mettez à jour le contrôle, vous ne déclenchez pas la fonction ON_EN_CHANGE et se retrouver dans une boucle récursive de "changement".

Il est possible de le faire avec une sorte de drapeau indiquant que c'est vous qui mettez à jour le contrôle, et non l'utilisateur, mais il est probablement préférable de sous-classer la fonction CEdit pour faire ce que vous voulez. Il existe quelques exemples de la manière de procéder (ce n'est pas aussi difficile qu'il n'y paraît), par exemple : https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X