CREACIÓN DE UN PROYECTO VC++ 1. En el escritorio pulsar sobre el icono Microsoft Visual C++. 2. Seleccionar el menú File->New 3. Sobre el asistente AppWizard que aparece seleccionar la opción de proyecto MFCAppWizard(exe) y rellenar los campos Project Name con el nombre a asignar a nuestro proyecto (ej VC) y Location para indicar el directorio del disco donde se salvará el proyecto, a continuación pulsar sobre el botón OK. 4. Sobre la ficha MFC AppWizard-Step1 seleccionar la opción Dialog based y pulsar sobre el botón Finísh. 5. Por último pulsar el botón OK sobre la ficha New Project Information. 6. Pulsar sobre el texto A HACER: Colocar aquí controles de cuadro de diálogo y pulsar la tecla “supr” para eliminar el texto del diálogo MODIFICACIÓN DEL PROYECTO Una vez creado el proyecto, podemos modificarlo añadiendo controles y eventos en la ventana de diálogo. En la ventana de la parte izquierda del proyecto aparece una estructura de navegación del proyecto con tres pestañas en la parte inferior: ClassView, ResourceView y FileView. Si pulsamos sobre estas pestañas vemos que el contenido de la ventana cambia mostrando en su interior la estructura en árbol de los elementos seleccionados. Si pulsamos sobre ClassView y pulsamos sobre los símbolos + para expandir el árbol observamos las 3 clases creadas por el asistente de aplicaciones AppWizard; CAboutDlg, CVCApp y CVCDlg. En el interior de estas clases un símbolo celeste identifica a una variable y uno violeta a una función (Método). Si existe el símbolo adicional de una llave, se indica que la variable o método tienen el atributo de protegido. Sí hacemos dobleClick sobre el título de la clase el compilador nos muestra en la ventana central el código fuente de la definición de la clase en el fichero asociado *.h, y si hacemos dobleClick sobre el nombre de un método de la clase en la ventana central aparece el código fuente de la misma en el fichero asociado *.cpp Si seleccionamos en el panel de navegación la pestaña ResourceView, aparece una lista de los recursos visuales disponibles en el proyecto. Si abrimos el árbol de Dialog se muestra la lista de los diálogos disponibles en nuestro proyecto, En este caso IDD_ABOUTBOX e IDD_VC_DIALOG. Si hacemos dobleClick sobre IDD_VC_DIALOG se mostrará en la ventana central la ventana del diálogo. Creación de Controles Vamos a añadir al diálogo tres elementos: dos botones y un texto editable. Para ello vamos a proceder de la siguiente manera: • Sobre el panel flotante de controles seleccionar el control Button haciendo clic sobre él. • Pulsar sobre el diálogo para situar el control • Modificar el tamaño pulsando el ratón sobre una de los indicadores de borde y arrastrar el ratón para cambiar el tamaño. • Para modificar el texto del botón pulsar sobre el botón para que esté seleccionado, pulsar el botón derecho del ratón y seleccionar la opción Properties. Modificar el contenido del campo Caption para cambiar el texto y el campo ID para cambiar el manejador del botón y pulsar Intro. Repetir el proceso de creación de un segundo botón y cambiar los textos asociados a Marcha y Paro y los ID a ID_MARCHA e ID_PARO. Añadimos a continuación un texto de edición al diálogo. Para ello: • Seleccionamos de la paleta de controles el control EditBox • Pulsamos sobre el diálogo para situar el control. • Con el botón derecho del ratón accedemos a Properties del control y modificamos el ID a ID_RELOJ. Creación de eventos de los controles • • • • • • • Seccionar la opción del menú View->ClassWizard Seleccionar la pestaña superior Message Maps En el control Class name seleccionar la clase CVCDlg En la lista Object IDs seleccionar el control IDC_MARCHA En la lista de Messages seleccionar BN_CLICKED Pulsar el botón Add Function Aceptar el nombre del evento a crear OnMarcha pulsando OK Repetir el procedimiento con el botón IDC_PARO Creación de variables de los controles • • • • • • • • En la ventana MFC ClassWizard seleccionar la pestaña superior Member Variables En el control Class name seleccionar la clase CVCDlg En la lista Object IDs seleccionar el control IDC_RELOJ Pulsar sobre el botón AddVariable Sobre el campo member variable name escribir m_reloj Sobre el campo Category seleccionar el valor control Sobre el campo Variable type seleccionar CEdit Pulsar sobre el botón aceptar para crear la variable Acceso a los valores de los controles CEdit Cuando se utilizan controles CEdit en un diálogo, se puede acceder a su contenido de dos formas distintas: 1. Como control CEdit 2. Como cadena de caracteres CString Cuando se accede a un CEdit en modo control se debe crear una variable de este tipo: por ejemplo CEdit m_ed; Una vez que disponemos de esta variable se pueden utilizar los siguientes métodos para acceder a su contenido: • Escritura: m_ed.SetWindowText(“hola”); • Lectura: CString cs;m_ed.GetwindowText(cs); Cuando se accede al control como cadena de caracteres u otro tipo de variable (int, long etc.) se debe crear la variable asociada en modo Value generándose una definición de la variable de la forma: CString m_ed; Para leer el valor del control se debe proceder a introducir el valor del control dentro de la variable m_ed para ello se utilizará el método UpdateData(TRUE); A partir de este momento m_ed contiene la información que se mostraba en el diálogo. Este método refresca los valores de todas las variables de un diálogo. Cuando se usa UpdateData con el valor FALSE se cambian los valores de todos los controles del diálogo con los valores de sus variables asociadas. Por ejemplo: m_ed=”hola”; UpdateData(FALSE); MessageBox Windows utiliza una ventana de información para mostrar mensajes que se denomina MessageBox. La forma de la ventana se puede ajustar indicando el tipo de icono y los botones que se deben mostrar. Dentro de las librerías de clases MFC hay una versión simplificada de este método que se denomina AfxMessageBox. Su forma más simple de utilización es: AfxMessageBox(“Hola”); Esta sentencia muestra en pantalla una ventana con el texto “Hola” y el botón Aceptar. Revisión de la aplicación • • • • Cerrar la ventana MFC ClassWizard pulsando sobre el botón OK Sobre el panel de navegación seleccionar la pestaña ClassView Abrir le árbol de la clase CVCDlg pulsando sobre el símbolo + de la misma Observar que se han creado en la clase los eventos OnParo() y OnMarcha() y la variable m_reloj Creación de temporizadores Un temporizador se crea con la función SetTimer(id_ timer, tiempo_ms, NULL); Si se crea un solo timer lo identificaremos por el nº 1. El segundo parámetro de la función es el tiempo que transcurre entre dos eventos consecutivos del timer. El tiempo se expresa en milisegundos, de forma que si especificamos 1000 en este parámetro indicaremos que los eventos del timer se generarán cada 1000 ms=1segundo. Para cancelar un timer se llama a la función KillTimer(id_timer); Las funciones SetTimer y KillTimer crean y destruyen un temporizador pero necesitamos crear también la función que gestionará el evento cada vez que transcurra tiempo_ms. Para crear el evento usaremos View-> ClassWizard->MessageMaps.Sobre la lista Object iDs seleccionaremos el objeto CVCDlg y sobre la lista Messages elegiremos el evento WM_TIMER y pulsaremos sobre el botón AddFunction. Se generará entonces el evento del timer con la siguiente estructura: void CVCDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CDialog::OnTimer(nIDEvent); } El parámetro nIDEvent que recibe OnTimer es el id_timer del timer que genera el evento. En nuestro caso si solo hay un timer ignoraremos ese argumento. Si se han creado varios timer en la aplicación, deberemos usar una estructura Switch-Case para crear el código específico para cada timer. El código creado se ha de insertar antes de la línea CDialog::OnTimer(nIDEvent) que será siempre la última sentencia de la función. Creación de código Una vez creada la estructura de la aplicación es necesario escribir el código de la aplicación. Nuestra aplicación debe crear el código necesario para contar segundos y mostrar el valor correspondiente en el texto de edición. Los botones Marcha y Paro iniciarán y terminarán la acción de contar. Necesitamos realizar las siguientes acciones: • • • • Crea una variable global para mantener el valor de cuenta Crear un temporizador de intervalo 1 seg cuando se pulsa el botón marcha Destruir el temporizador de 1 seg cuando se pulsa el botón Paro Actualizar el valor de los segundos acumulados y mostrarlos en el control IDC_RELOJ cuando se reciba el evento de temporizador. Para crear una variable global hacemos dobleClick sobre el nombre de la clase CVCDlg en el panel de navegación. En el fichero VCDlg.h en edición, incluimos la línea int segundos class CVCDlg : public CDialog { // Construction public: CVCDlg(CWnd* pParent = NULL); // standard constructor int segundos; // Dialog Data Para crear el temporizador editamos la función OnMarcha. Para acceder a su código hacemos dobleClick sobre el nombre del método OnMarcha en el panel de navegación. Incluimos la línea de código SetTimer(1,1000,NULL); Para destruir el temporizador insertamos la línea de código KillTimer(1) en la función OnParo() Para actualizar el valor de cuenta insertamos en el código del evento OnTimer las líneas de código necesarias para incrementar la variable de cuenta y mostrar el valor en el diálogo. Necesitamos además inicializar la variable segundos a cero antes de empezar para ello escribimos la sentencia segundos=0; en el código de la función OnInitDialog al final de la misma después del comentario // TODO: Add extra initialization here CString es una clase de manejo de cadenas de caracteres de las librerías MFC que contiene el método Format equivalente a la instrucción printf de lenguaje C. La variable m_reloj es del tipo CEdit que es una clase MFC que contiene el método SetWindowText que permite actualizar el contenido de texto del control Compilar y ejecutar la aplicación El compilador contiene la siguiente barra de herramientas El primer botón de la barra compila el fichero fuente en edición El segundo botón Compila y enlaza las librerías creando el ejecutable El tercer botón crea y lanza la aplicación. Pulsar este tercer botón y comprobar el funcionamiento de la aplicación creada. Ficheros del proyecto Si miramos el contenido del directorio de la aplicación generada veremos fichero fuente *.cpp y *.h, el fichero *.dsw que contiene el proyecto y los directorios res y debug En el interior del directorio debug encontramos el ejecutable creado VC.exe y los fichero intermedios de la compilación. Para llevarnos el proyecto y compilar en otra máquina recitamos al menos el directorio principal y el subdirectorio res. El subdirectorio debug no es necesario ya que se vuelve a crear al compilar nuevamente Documentación de las clases MFC Se puede revisar la documentación de las clases MFC en la dirección: http://msdn.microsoft.com/en-us/library/bk77x1wx(VS.80).aspx