Apunte de Visual C++
Por: Demian Panello demianpanello@yahoo.com.ar
Capítulo II
Indice rápido del capítulo 2:
Otro control importante en Windows (además del botón), son los cuadros de edición. En estos controles se basa prácticamente el 70% del ingreso de datos en una aplicación Windows. Por lo tanto es después del botón, el control más común.
Ahora realizaremos un programa que utilizará un cuadro de edición, y el objetivó será que, mientras escribimos algo en el cuadro de edición, simultáneamente se escribirá lo mismo en el título del diálogo (ventana).
Entonces, vaya al menú FILE –NEW y seleccione, como en el ejemplo anterior, MFC AppWizard (exe) y ponga Edicion como Project Name. Continúe con el Asistente de aplicaciones como en el primer ejemplo hasta crear la estructura básica del programa.
Luego que tenga en pantalla el diálogo con los dos botones por defecto Aceptar y Cancelar, agregue, desde la barra de controles, un cuadro de edición (icono ab| ), y acceda a sus propiedades haciendo click con el derecho del mouse sobre el control. Verifique que la propiedad ID sea IDC_EDIT1 (por defecto tiene que ser esa), no va hacer falta que la modifique.
Cierre el cuadro de propiedades.

Bien, como queremos que al momento de estar escribiendo cada carácter del texto que ingresamos en el cuadro de edición, se muestre además en la barra de título de la ventana, debemos escribir código para el mensaje EN_CHANGE del cuadro de edición.
Para crear este gestor de mensaje, debemos acceder al ClassWizard, esto se logra haciendo click con el derecho del mouse sobre el control de edición y seleccionando la opción ClassWizard del menú contextual.
En ClassWizard verifique que en la lista Object ID se encuentre seleccionado IDC_EDIT1 y en la lista Messages, EN_CHANGE. Presione Add Function, EN_CHANGE pasará a formar parte de la lista Member Functions, selecciónela y presione Edit Code.
Escriba entonces el siguiente código:
void CEdicionDlg::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
CEdit* edTexto; (1)
CString strDato; (2)
edTexto = (CEdit*) GetDlgItem(IDC_EDIT1); (3)
edTexto->GetWindowText (strDato); (4)
SetWindowText(strDato); (5)
}
Los comentarios que están al principio (en verde), los colocó ClassWizard automaticamente y hacen referencia en el caso que se tratara de un control de texto enriquecido, que no envía directamente este mensaje. Esto por lo pronto no nos interesa.
Antes de continuar analizando las líneas de código enumeradas, conviene destacar lo siguiente: "TODOS LOS CONTROLES (OBJETOS) DE WINDOWS SON UNA VENTANA", esto quiere decir que todos los controles son derivados de la clase CWnd.
El control de edición es un objeto CWnd, y en muchas ocasiones dejaremos esto así, pero a veces es conveniente convertir el tipo de los controles a su clase correspondiente, en nuestro caso CEdit.
Por esto en la linea (1) se declara la variables edTexto como un puntero a la clase CEdit, pues la intención es asociar el cuadro de edición con esta variable, para así poder hacer uso de las funciones miembro de la clase CEdit.
En la línea (2) se declara un variable de tipo CString (cadena), donde se almacenaran los caracteres que se van ingresando.
Luego de las declaraciones de variables, debemos asociar el puntero con el cuadro de edición. Esto hace la línea (3) a través de la función GetDlgItem a la cual se le pasa el ID del objeto a asociar con la variable; el problema es que GetDlgItem retorna un puntero a CWnd y yo quiere uno a CEdit, por eso se utiliza el operador: (Cedit*), que permite realizar la conversión al tipo deseado.
Una vez que uno tiene la variable asociada con el control se pueden usar las funciones miembro de esa clase. En la línea (4) se obtiene el texto del cuadro de edición con GetWindowText a la cual se le pasa como parámetro la variable CString. Note que se llama la función por medio del operador: -> pues la variable es un puntero a CEdit y no una variable CEdit.
En la última línea, (5), se establece el título del cuadro de diálogo por medio de la función SetWindowText a la cual se le pasa la variable CString que desde la línea anterior viene cargada con el contenido del cuadro de edición.
Se escribe SetWindowText directamente porque por defecto actuará sobre la clase principal que es la que da origen al cuadro de diálogo, también se podría haber usado el puntero this que es el que apunta al objeto por defecto, (quedaría: this -> SetWindowText(strDato). )
Para el caso de los controles que permiten ingreso de datos es muy importante el uso de esa información que probablemente se pasarán a diferentes gestores de mensajes que los procesará. Por ejemplo se ingresa una edad y en algún momento hay que validarla.
Los datos contenidos en un control se transfieren a variables que luego el código manipula, después se pueden volver a volcar al control.
Para ejemplificar esto modificaremos la aplicación anterior agregando un botón en el cuadro de diálogo. Escribiremos el código adecuado para cuando se pulse el botón se invierta el contenido del cuadro de dialogo.
En vez de agregar un nuevo botón, utilicemos el botón CANCELAR. Selecciónelo, vaya a Propiedades, modifique la propiedad Caption a Invertir y cambie el ID por IDC_INVERTIR.
El Cuadro de diálogo debería quedar más o menos así:

Primero crearemos una variable miembro para el cuadro de edición; para esto accedemos a ClassWizard y seleccionamos la solapa Members Variables.
Una vez ahí se marca de la lista Control’s ID, el ID del cuadro de edición, (IDC_EDIT1), y se pulsa el botón Add Variable. En la ventana que aparece ingrese m_strDato como Member Variable Name, Category Value y Variable Type Cstring (puesto que el valor ingresado será una cadena). Acepte esta ventana. Y acepte la ventana del ClassWizard.
Bien, ya tenemos una variable para almacenar el contenido del cuadro de edición. ClassWizard relaciona automáticamente las variables miembro con sus clases, así que sólo debemos escribir el código que invierta lo ingresado y lo deje nuevamente en el mismo cuadro de edición.
Seleccione el botón Invertir y acceda a ClassWizard.
Seleccione la solapa Messages Map, IDC_INVERTIR en Object’s ID y BN_CLICKED en Messages.
Presione Add Function.
Acepte el nombre sugerido y la función se agregará a la lista Member Functions.
Presione Edit Code.
Estamos entonces en la función OnInvertir de la clase CedicionDlg donde escribiremos el código que invertirá lo ingresado. Escriba:
void CEdicionDlg::OnInvertir()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); (1)
if (m_strDato.IsEmpty ()== FALSE) (2)
{
MessageBox("Ahora se invertirá: " + m_strDato); (3)
m_strDato.MakeReverse (); (4)
UpdateData(FALSE); (5)
}
}
Lo primero que hay que hacer es que el contenido del cuadro de edición pase a la variable miembro. Esto hace la línea (1) con la función UpdateData(TRUE) luego de esta linea la variable m_strDato contiene lo ingresado en el control.
En la línea (2) se verifica que no esté vacía (lo que inplica que el cuadro de edición se dejó en blanco). En caso de haber ingresado algo, entonces hay que darlo vuelta, se muestra un mensaje advirtiendo esto: línea (3).
En (4) se hace uso de la función MakeReverse() de la clase Cstring, que invierte la cadena sobre sí misma.
En línea (5) se transfiere el contenido de la variable a el control.
Resumiendo: