Visual Studio MFC cambia el texto en el control de edición mientras escribe / dinámicamente
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_isOn
valor sería =0

y 1 control de edición, ID = txtInputBox
, con CString
variable 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 SetDlgItemText
el 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_CHANGE
trabajar 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::SetSel
pero 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
Parece que necesita usar la ON_EN_CHANGE
notificació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_CONTROL
arriba con su definición (posiblemente txtInputBox
, pero nuevamente, estos son normalmente en mayúsculas , así que no estoy seguro ).
También cambie CMyDialog
el 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_CHANGE
mensaje se envía después de que se haya actualizado el control, mientras que ON_EN_UPDATE
se llama justo antes de actualizarlo.
Los manejadores de mapas de mensajes se describen en la sección Comentarios de la CEdit
documentació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_CHANGE
nuevo 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 CEdit
control 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