Visual Studio MFC cambia el texto en el control de edición mientras escribe / dinámicamente

Dec 04 2020

Estoy tratando de configurar una aplicación MFC C ++ en Visual Studio 2019 de modo que modifique el texto del usuario mientras escribe.

El diseño actual es de 2 botones de opción,

ID = rdbOn(establecido en Group = True, con Value int variable m_isOn= 1)

ID = rdbOff, el m_isOnvalor sería =0

y 1 control de edición, ID = txtInputBox, con CStringvariable de valorm_inputString

Actualmente, para probar puedo ver cómo funcionaría para un botón al hacer clic, tomaría algo como lo siguiente y solo SetDlgItemTextel resultado. Pero eso sería después de que hayan escrito, no MIENTRAS están escribiendo.

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

Actualización: me puse EN_CHANGEa trabajar Pude ponerme a EN_CHANGEtrabajar con la sugerencia de bandera del usuario @GoGoWorx. Sin embargo, ahora solo tengo un pequeño problema de que el cursor está de regreso al comienzo del control de edición txtInput.
Estoy leyendo sobre el uso de a, CEdit::SetSelpero no sé cómo usarlo directamente en mi código. Probé CEdit control de MFC, colocando el cursor al final de la cadena después de 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);
}

Respuestas

3 GoGoWorx Dec 04 2020 at 08:04

Parece que necesita usar la ON_EN_CHANGEnotificación del mapa de mensajes (llamada después de que el control se haya actualizado debido a escribir o pegar, por ejemplo)

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
}

No estoy seguro de qué está usando para el identificador numérico para el control de edición, ya que estos son típicamente definiciones en mayúsculas: reemplace IDC_EDIT_CONTROLarriba con su definición (posiblemente txtInputBox, pero nuevamente, estos son normalmente en mayúsculas , así que no estoy seguro ).

También cambie CMyDialogel nombre de su clase de diálogo.

Tenga en cuenta que aquí estamos usando el ON_EN_CHANGEcontrolador de mapa de mensajes en lugar de ON_EN_UPDATE, ya que el ON_EN_CHANGEmensaje se envía después de que se haya actualizado el control, mientras que ON_EN_UPDATEse llama justo antes de actualizarlo.

Los manejadores de mapas de mensajes se describen en la sección Comentarios de la CEditdocumentación de control:https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160

Con respecto a su preocupación por modificar cosas a medida que el usuario escribe, esto debería estar bien, ya que cada cambio (pulsación de tecla o pegar desde el portapapeles, etc.) debería activar la llamada de este controlador, donde puede cambiar lo que necesite. Solo asegúrese de que cuando actualice el control, no active de ON_EN_CHANGEnuevo y termine en un ciclo de 'cambio' recursivo.

Es posible que pueda hacer esto con algún tipo de indicador para indicar que es usted quien actualiza el control, en lugar del usuario, sin embargo, probablemente sea mejor subclasificar el CEditcontrol para hacer lo que desea. Hay algunos ejemplos de cómo hacer esto (no es tan difícil como podría parecer), por ejemplo:https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications