Visual Studio MFC ändert Text in Edit Control während der Eingabe / dynamisch
Ich versuche, eine MFC C ++ - App in Visual Studio 2019 so einzurichten, dass der Text des Benutzers während der Eingabe geändert wird.
Das aktuelle Layout besteht aus 2 Optionsfeldern.
ID = rdbOn
(auf Group = gesetzt True
, mit Value int variable m_isOn
= 1
)
ID = rdbOff
, m_isOn
Wert wäre =0

und 1 Edit Control, ID = txtInputBox
, mit Value- CString
Variablem_inputString
Derzeit kann ich zum Testen sehen, wie es für eine Schaltfläche beim Klicken funktionieren würde. Es würde ungefähr das Folgende und nur SetDlgItemText
das Ergebnis erfordern. Aber das wäre, nachdem sie getippt haben, nicht WÄHREND sie tippen.
void Onsomebtnclick()
{
//convert CString to String of m_inputString
//do some string manipulation
//convert back to CString
//SetDlgItemText(txtInputBox, result)
}
Update: machte sich EN_CHANGEan die Arbeit Ich konnte EN_CHANGE
mit dem Flaggenvorschlag von Benutzer @GoGoWorx arbeiten. Jetzt habe ich jedoch nur ein kleines Problem, dass sich der Cursor wieder am Anfang des Bearbeitungssteuerelements befindet txtInput
.
Ich lese über die Verwendung von a CEdit::SetSel
, weiß aber nicht, wie ich das direkt in meinem Code verwenden soll. Ich habe versucht, CEdit MFC zu steuern und den Cursor nach SetWindowText auf das Ende der Zeichenfolge zu setzen
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);
}
Antworten
Es hört sich so an, als müssten Sie die ON_EN_CHANGE
Message-Map-Benachrichtigung verwenden (wird aufgerufen, nachdem das Steuerelement beispielsweise durch Eingabe oder Einfügen aktualisiert wurde).
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
}
Ich bin mir nicht sicher, was Sie für die numerische Kennung für das Bearbeitungssteuerelement verwenden, da es sich in der Regel um Großbuchstaben handelt. Ersetzen Sie die IDC_EDIT_CONTROL
obigen durch Ihre Definition (möglicherweise txtInputBox
, aber auch hier handelt es sich normalerweise um Großbuchstaben , daher bin ich mir nicht sicher ).
Ändern Sie auch CMyDialog
den Namen Ihrer Dialogklasse.
Beachten Sie, dass wir hier den ON_EN_CHANGEMessage-Map-Handler anstelle von verwenden ON_EN_UPDATE
, da die ON_EN_CHANGE
Nachricht nach der Aktualisierung des Steuerelements gesendet wird, während ON_EN_UPDATE
sie unmittelbar vor der Aktualisierung aufgerufen wird.
Die Message-Map-Handler werden im Abschnitt " Bemerkungen " der CEdit
Steuerungsdokumentation beschrieben:https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160
In Bezug auf Ihre Bedenken, Dinge während der Benutzertypen zu ändern, sollte dies in Ordnung sein, da jede Änderung (Tastendruck oder Einfügen aus der Zwischenablage usw.) den Aufruf dieses Handlers auslösen sollte, in dem Sie alles ändern können, was Sie benötigen. Stellen Sie nur sicher, dass Sie beim Aktualisieren des Steuerelements das Steuerelement nicht erneut auslösen ON_EN_CHANGE
und in einer rekursiven Änderungsschleife enden.
Möglicherweise können Sie dies mit einer Art Flag tun, um anzuzeigen, dass Sie das Steuerelement aktualisieren, im Gegensatz zum Benutzer. Es ist jedoch wahrscheinlich besser, das CEdit
Steuerelement in Unterklassen zu unterteilen, um das zu tun, was Sie möchten. Es gibt einige Beispiele dafür (es ist nicht so schwierig, wie es sich anhört), zum Beispiel:https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications