UNIVERSIDAD DEL ISTMO Ingeniería en computación PROFESOR M. en C. J. Jesús Arellano Pimentel NOMBRE DE LA PRÁCTICA Sumar dos números enteros en Visual C con API’s Win32. OBJETIVO GENERAL Aprender a crear y utilizar controles de interfaz de usuario como botones y cajas de texto en aplicaciones Win32. - OBJETIVOS ESPECÍFICOS EQUIPO REQUERIDO SOFTWARE REQUERIDO Crear botones y procesar el mensaje asociado a estos. - Crear cajas de texto para leer y mostrar datos. - Sumar dos números enteros introducidos en cajas de texto. Computadora personal con 512 MB de RAM mínimo. - Windows Vista/7/8 - Microsoft Visual Studio Express 2012 para escritorio de Windows. 1.- Fundamentos Los controles tipo botón simulan el comportamiento de un pulsador o un interruptor [Pozo04]. En esta práctica solo se emplearán los de tipo pulsador los cuales permiten al usuario ejecutar ciertas acciones para dar órdenes a una aplicación. En muchos aspectos estos controles funcionan igual que los menús o botones de la barra de herramientas, ya que todos estos generan el mensaje WM_COMMAND. Normalmente se componen de un área rectangular que contiene un texto indicando la acción a realizar. Un control de caja de texto es una ventana rectangular que permite a los usuarios introducir y editar texto desde el teclado. Cuando este control está seleccionado muestra el texto que contiene y un cursor intermitente que indica el punto de inserción de texto. Para seleccionarlo el usuario normalmente da un clic con el ratón en su interior, es entonces cuando el usuario podrá introducir o borrar texto en él. Al crear este tipo de ventanas (cajas de texto) se pueden activar ciertas propiedades que solo permiten la edición de dígitos, también pueden crearse para no aceptar más caracteres de los que se pueden visualizar en su tamaño o activar el scroll vertical u horizontal. 2.- Desarrollo 2.1 Aplicación para sumar dos números introducidos a través de cajas de texto Paso 1 Iniciar el MVS Express 2012. Ingeniería en Computación M. C. J. Jesús Arellano Pimentel 1 Paso 2 Crear un nuevo proyecto Win32. Seleccionar la opción del menú Archivo->Nuevo Proyecto. Del cuadro de diálogo Nuevo proyecto en Plantillas seleccionar Visual C++ y Win32; en tipo de aplicación seleccionar Proyecto Win32 Visual C++ (ver Figura 1). El nombre del proyecto o solución podría ser SumaWin32. Presionar el botón Aceptar. Figura 1. Cuadro de diálogo Nuevo Proyecto para la aplicación SumaWin32. Paso 3 Configurar el Proyecto Actual. En el Asistente para aplicaciones Win32 presionar el botón siguiente; después deshabilitar la casilla de verificación de Comprobación del ciclo de vida de desarrollo de seguridad(SDL); finalmente oprimir el botón Finalizar. Paso 4 Editar el código del archivo SumaWin32.cpp. En la línea 102 de la función InitInstance correspondiente a la creación de la ventana principal, modificar el segundo par de parámetros de la línea 103: CW_USEDEFAULT, 0 por 200, 200, respectivamente, esto definirá el tamaño inicial para la ventana en 200 pixeles en x y 200 pixeles en y. En la función WndProc (línea 131) agregar las siguientes variables: static HWND hBtnSumar, hEdtNum1, hEdtNum2, hEdtSuma; En la misma función WndProc, dentro de la estructura switch, agregar el procesamiento del mensaje WM_CREATE previo al procesamiento del mensaje WM_COMMAND con el siguiente código: case WM_CREATE: hBtnSumar = CreateWindowEx(0, L"BUTTON", /* Nombre de la clase */ L"Sumar", /* Texto del título */ BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, /* Estilo */ 10, 80, /* Posición */ 80, 34, /* Tamaño */ hWnd, /* Ventana padre */ (HMENU)ID_BTNSUMAR,/*Identificador del control */ Ingeniería en Computación M. C. J. Jesús Arellano Pimentel 2 hInst, NULL); /* Instancia */ /* Sin datos de creación*/ hEdtNum1 = CreateWindowEx(0, L"EDIT", /* Nombre de la clase */ L"", /* Sin texto de título */ ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_NUMBER, /* Estilo */ 10, 45, /* Posición */ 35, 25, /* Tamaño */ hWnd, /* Ventana padre */ (HMENU)ID_EDTNUM1,/* Identificador del control */ hInst, /* Instancia */ NULL); /* Sin datos de creación*/ hEdtNum2 = CreateWindowEx(0, L"EDIT", /* Nombre de la clase */ L"", /* Sin texto de título*/ ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_NUMBER, /* Estilo */ 65, 45, /* Posición */ 35, 25, /* Tamaño */ hWnd, /* Ventana padre */ (HMENU)ID_EDTNUM2,/* Identificador del control */ hInst, /* Instancia */ NULL); /* Sin datos de creación */ hEdtSuma = CreateWindowEx(0, L"EDIT", /* Nombre de la clase */ L"", /* Sin texto de título */ ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_NUMBER | ES_READONLY,/* Estilo */ 120, 45, /* Posición */ 35, 25, /* Tamaño */ hWnd, /* Ventana padre */ (HMENU)ID_EDTSUMA,/* Identificador del control */ hInst, /* Instancia */ NULL); /* Sin datos de creación */ SetFocus(hEdtNum1); break; En la misma función WndProc, pero ahora dentro de la estructura switch que pertenece al procesamiento del mensaje WM_COMMAND, codificar la pulsación del botón sumar: case ID_BTNSUMAR: { TCHAR szNum1[32], szNum2[32], szSuma[32]; int num1, num2, suma; /*Obtiene el texto y lo convierte de texto a entero*/ GetDlgItemText(hWnd, ID_EDTNUM1, szNum1, 31); num1 = _tstoi(szNum1); /*Obtiene el texto y lo convierte de texto a entero*/ GetDlgItemText(hWnd, ID_EDTNUM2, szNum2, 31); num2 = _tstoi(szNum2); suma = num1 + num2; _tcprintf(szSuma,L"%d",suma); SetDlgItemText(hWnd,ID_EDTSUMA,szSuma); } break; Ingeniería en Computación M. C. J. Jesús Arellano Pimentel 3 Ya por último, en esta misma función (WndProc) modificar el código del procesamiento para mensaje WM_PAINT de tal forma que quede como el siguiente código: case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: agregar código de dibujo aquí... TextOut(hdc,10,30,L"Num1",_tclen(L"Num1")); TextOut(hdc,50,48,L"+",_tclen(L"+")); TextOut(hdc,65,30,L"Num2",_tclen(L"Num2")); TextOut(hdc,105,48,L"=",_tclen(L"=")); TextOut(hdc,120,30,L"Suma",_tclen(L"Suma")); EndPaint(hWnd, &ps); break; Paso 5 Agregar las constantes simbólicas asociadas a los recursos en el archivo Resource.h. En segmentos de código anterior se han utilizado constantes simbólicas asociadas a los recursos (las tres cajas de edición y el botón), por lo que es necesario agregarlas en el segmento de // Valores predeterminados siguientes para nuevos objetos con las siguientes líneas de código (constantes simbólicas): // Valores predeterminados siguientes para nuevos objetos // #define ID_BTNSUMAR 201 #define ID_EDTNUM1 202 #define ID_EDTNUM2 203 #define ID_EDTSUMA 204 Paso 6 Guardar y Compilar Guardar todos los dos archivos modificados y Compilar. La ejecución de la aplicación se muestra en la Figura 2. Note que las propiedades de las dos primeras cajas de texto solo permiten introducir dígitos, mientras que tercer caja no permiten la edición, solo permiten mostrar texto. Figura 2. Ventana de la aplicación SumaWin32. Ingeniería en Computación M. C. J. Jesús Arellano Pimentel 4 3.- Ejercicios 3.1 Realizar las cuatro operaciones aritméticas básicas Crear tres botones más para poder realizar las cuatro operaciones aritméticas básicas de sumar, restar, multiplicar y dividir. Sustituir el símbolo de “+” por la operación que se realice según el botón pulsado. 4.- Referencias [Pozo04] Pozo Coronado Salvador. Win API con Clase. Aplicaciones con API 32. Julio de 2004. Disponible en: http://winapi.conclase.net Ingeniería en Computación M. C. J. Jesús Arellano Pimentel 5