Visual Studio MFC ändert Text in Edit Control während der Eingabe / dynamisch

Dec 04 2020

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_isOnWert wäre =0

und 1 Edit Control, ID = txtInputBox, mit Value- CStringVariablem_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 SetDlgItemTextdas 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_CHANGEmit 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

3 GoGoWorx Dec 04 2020 at 08:04

Es hört sich so an, als müssten Sie die ON_EN_CHANGEMessage-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_CONTROLobigen 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 CMyDialogden Namen Ihrer Dialogklasse.

Beachten Sie, dass wir hier den ON_EN_CHANGEMessage-Map-Handler anstelle von verwenden ON_EN_UPDATE, da die ON_EN_CHANGENachricht nach der Aktualisierung des Steuerelements gesendet wird, während ON_EN_UPDATEsie unmittelbar vor der Aktualisierung aufgerufen wird.

Die Message-Map-Handler werden im Abschnitt " Bemerkungen " der CEditSteuerungsdokumentation 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_CHANGEund 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 CEditSteuerelement 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