Abrir el menú de navegación
Cerrar sugerencias
Buscar
Buscar
es
Change Language
Cambiar idioma
Cargar
Iniciar sesión
Iniciar sesión
Descargar gratis durante días
0 calificaciones
0% encontró este documento útil (0 votos)
30 vistas
C++ Win32 API
Cargado por
Belen
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido,
reclámalo aquí
.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Descargar ahora
Descargar
Guardar C++ Win32 API para más tarde
Descargar
Guardar
Guardar C++ Win32 API para más tarde
0%
0% encontró este documento útil, undefined
0%
, undefined
Insertar
Compartir
Imprimir
Reportar
0 calificaciones
0% encontró este documento útil (0 votos)
30 vistas
C++ Win32 API
Cargado por
Belen
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido,
reclámalo aquí
.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Descargar ahora
Descargar
Guardar C++ Win32 API para más tarde
Carrusel anterior
Carrusel siguiente
Descargar
Guardar
Guardar C++ Win32 API para más tarde
0%
0% encontró este documento útil, undefined
0%
, undefined
Insertar
Compartir
Imprimir
Reportar
Descargar ahora
Descargar
Está en la página 1
/ 268
Buscar
pantalla completa
ieee eree mica Autor: Salvador Pozo Coronado e-m: :
[email protected]
Trascripcién del curso alojado en la pagina: http://winapi.conclase.net/ (© Febrero de 2.001 Salvador Pozo,
[email protected]
Nota: existen varios enlaces a paginas que no existen, poco a poco se irin completando todas las paginas, disculpad las molestias. Tabla de contenido Tabla de contenido... Independencia de la maquin: Recursos 4 Ventanas. 15 Eventos. 15 Proyecto: 16 Convenciones seveennnnnnnttee evenness 16 Controles.. Capitulo 1 Componentes de una ventana... evenness 1B El borde de la ventana. Barra de titulo. Caja de minimizar.... Caja de maximizar. Caja de cerrar. . Caja de control de ments. Ment. ... Barra de mem. Barra de scroll horizontal. Barra de scroll vertical. El area de cliente Capitulo 2 Notacion Hiingara .. Ejemplos:.... Capitulo 3 La funeién "WinMain”. Parametros de entrada de "WinMain' 21 Funcién WinMain tipica “21 Declaracion Inicializacién.. Bucle de mensajes. Capitulo 4 El procedimiento de ventana Sintaxis.... Prototipo de procedimiento de ventana Implementacién de procedimiento de ventana simple Primer ejemplo de programa Windows Capitulo 5 Ments 1. Usando las funciones para inserci6n item a item:.. Uso bisico de MessageBox: Respondiendo a los mensajes del meni Ejemplo de programa Windows con ment. Ficheros de recursos... Como usar los recursos de ment: Capitulo 6 Dislogo basico. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netFicheros de recursos: Procedimiento de didlogo: Sintaxis. Prototipo de procedimiento de didlogo. Implementacién de procedimiento de didlogo para nuestro ejemplo Capitulo 7 Control bisico Edit. Fichero de recursos... El procedimiento de didlogo y los controles edit Variables a editar en los cuadros de dislogo.... Iniciar controles edit Devolver valores a la aplicacién Ajiadir la opcién de cancelar .. Fichero de recursos para editar enteros.. Variables a editar en los cuadros de diilogo.... Iniciar controles edit de enteros Devolver valores a la aplicacin Capitulo 8 Control bésico ListBox Ficheros de recursos Iniciar controles listbox Devolver valores a la aplicacién Capitulo 9 Control basico Button Ficheros de recursos... Iniciar controles button Tratamiento de acciones de los controles button Capitulo 10 Control bisico Static .. Ficheros de recursos... Iniciar controles static Tratamiento de acciones de los controles static... Capitulo 11 Control basico ComboBox. Ficheros de recurs0$....0. Iniciar controles ComboBox. Devolver valores a la aplicacién Capitulo 12 Control basico Scrollbar. Ficheros de r2cUts08 2... Iniciar controles Scrollbar. Iniciar controles scrollbar: estructura SCROLLINFO Procesar los mensajes procedentes de controles Scrollbar. Procesar mensajes de scrollbar usando SCROLLINFO ... Devolver valores a la aplicacion Button styles: Combo box styles Dialog box styles: .. Edit styles... List box style Valores de nCmdShow: . Seroll bar styles: Stati styles: - ‘Window ex_styles:.. Window styles: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netEstructura CREATESTRUCT ... 108 Definicion: 108 Descripeién: 108 Observaciones: 109 Estructura MINMAXINFO.. 110 Definicion: 110 Descripeion: 110 Estructura MSG swe LL Definicion: LL DeseripeiOn: rr - Estructura SCROLLINFO .. ee en 112 Definici6n: ocr sen Descripeién: .. .. .. .. .. eeceee IZ Estructura STARTUPINFO.. seen wu 114 Definicion: . . . . . . Ld Descripeion:.... 114 Observacione 118 Estructura WNDCLASS 119 Definicion: 119 Deseripeion: 119 AppendMe 123 SintaKis: asec sen 123 Parametros: . . . . . . . 123 Valor de retomo.. su 124 Observacione 124 CreateMent 126 Sintaxis: . sw 126 Parametr Valor de retorno....... Observaciones: CreateWindows «000 6 Sintaxis: 127 Pardmett0S? ....s.0se 127 Valor de retomno: 129 Observaciones: 2a 129 DefWindowProe: Sintaxis: DestroyMenu: Sintaxis: .. 7 134 Parametros:... wa 134 134 2 13S Sintaxis: 135 Parametré 135 Valor de retorno....... Observaciones .. .. .. .. .. . eee 3S (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net137 137 DialogProe: Sintaxis: Parametros:...... 137 Valor de retorno:.. 137 Observaciones: 137 DispatchMessage: 139 Sintaxis:.. 139 Parémetros: 139 Valor de retorn 139 Observaciones: 139 DrawMemuBar: 140 Sintaxis: Parimetros: 140 Valor de retorno:.. 140 EndDialog: 14d Sintaxis:.. 11 Parametros: . i4l Valor de retomo:.. 4 Observacione: 141 GetDIgitem: 142 Sintaxis: 142 Parametros: 142 Valor de retorno: 142 Observaciones: 142 GetDIgltemint 143 Sintaxis: 143, Parametros: 13 Valor de retom: 143, Observaciones:... ' GetDlgltemText: . . . . . . 145 Sintaxis: - a 145 Parametros: . . . . . . . 145 Valor de retomn: 145, Observaciones: 145 GetMessage: 146 Sintaxis: . 146 146 146 146 GetScrollinfo: 148, Sintaxis: .. 148, 148 149 Observaciones 149 GetScrollPos’ 150 Sintaxis: 150 Parametros: 150 Valor de retorno:.. . 150 Observaciones .. .. .. .. .. . eee 150 (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netGetScrollRange: 152 Sintaxis: 152 Parametros: ....... 152 Valor de retorno: 152 Observaciones: 153 InsertMem 154 Sintaxis: .. 154 Parametros: 134 Valor de retorn 155 Observaciones: 155 LoadMenu.... 158 Sintaxis: 158 Pardmetros: .. .. .. .. .. . sees LSB Valor de retormno:.. 158 Observaciones 158 159 159 159 163 Valor de retomo: Observaciones: 163, PostMessage: Sintaxis: ... . 7 7 Parametros: . . . . . . . 164 PostQuitMessage Sintaxis: .. Observaciones: 166 RegisterClass: 167 Sintaxis: .. L67 Parametros: ... 167 Valor de retomo:.. 167 Observaciones: 167 SendDgltemMessa; 168 Sintaxis: 168 Pardmetros: 168 Valor de retom: 168 Observaciones: . . . . . . . 168 SendMessage: 169 Sintaxis: . 169 Pardmetros: 169 Valor de retomo:.. 169 Observacione 169 SetDlgitemInt: 170 Sintaxis: 170 Parametros: 170 Valor de retorno: . . . . . . 170 (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net170 171 171 171 171 171 Observaciones: SetDigitemText: Sintaxis: SetFocus... 172 Sintaxis: . 172 Pardmetros: 172 Valor de retom: 172 Observacione va 12 SetMenu: vw LB Sintaxis: 173 PardimettOs? nnn 173, Valor de retorno: . . . . . . 173 Observacione 173 SetScrolllnfo:... 174 Sintaxis: 174 Pardmetros: 174 Valor de retom: 175 Observaciones: 175 SetScrollPos: 176 Sintaxis: 176 Parametros: 176 Valor de retomo:.. 176 Observaciones: 177 SetScrollRange: 178 Sintaxis: 178 Parametros: nnn 178 Valor de retorno: . . . . . . 178 Observacione 179 Show Window: 180 Sintaxis: 180 Pardmetros: 180 Valor de retom: 180 Observaciones.... 180 TranslateMessage: 181 Sintaxis: 181 Pardimetros: nnn 181 Valor de retorno: . . . . . . 181 Observaciones: 181 WindowProe:.. 182 Sintaxis: .. 182 Pardmetros: 182 Valor de retom: 182 Observaciones: 182 ‘WinMain: 183, Sintaxis: - so 183 Parametros: . . . . . . . 183 (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netValor de retorno: 183 Observaciones 183 LOWORD. 185 Definicion:.. 185 Descripci6n: oe 185 Valor de retorno:... os 185 Observaciones...... oe 185 MAKEINTRESOURCE 186 Definicion: Desctipeion: Valor de retorno: Observaciones:....... . Mensaje CB_ADDSTRING......... . . - ene 188 Definicién: - nse 7 Descripcion: - . . - - enon 188 Valor de retorno:... 188 Observacione: 188 Mensaje CB_FINDSTRING.. 189 Definicién: 189 Deseripeion: 189 Valor de retorno: 189 Observaciones:.... 189 Mensaje CB_FINDSTRI 190 Definicion: Deseripeion:.. Valor de retorno: Observaciones.... Mensaje CB_GETCURSEL Deficit nes sen Descripcién: .. .. .. .. .. sees LOL Valor de retomo... sn . Mensaje CB_GETLBTEXT . . . . . . 192 Definici6n: ree seo 192 Deseripeion:.. 192 Valor de retorno:.. 192 Observacione: 192 Mensaje CB_GETLBTEXTLEN. Definicion: Deseripeion: - Valor de retorno: . . . . . . 193 Observaciones:... 193 Mensaje CB_SELECTSTRING 194 Definicion: 194 Deseripeion:.. 194 Valor de retorno: 194 Observaciones:..... 194 Mensaje EM_LIMITTEXT. 195 DefiniciOM err sen Descripcion: .. .. .. .. .. eee LOS (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netValor de retorno: Observaciones:.... 195 Mensaje LB_ADDSTRING.. 196 DefiniciOM orn 196 Descripcion: .. 196 Valor de retomn... 196 Observaciones:.... Mensaje LB_GETCURSEL.. Definicién: Deseripeion: Valor de retomno: Observaciones:.... Mensaje LB_GETTEXT. Definicién: Descripcion: Valor de retomo:.. Observacione Mensaje LB_GETTEXTLEN Definicién: Deseripeion: Valor de retorno: Observaciones:.... Mensaje LB_SELECTS’ Definicién: Descripeion:... Valor de retorno: Observaciones..... Mensaje SBM_GETPOS Definici6n: one Descripcién: Valor de retorno::... Mensaje SBM_GETRANGE. Definicién: Descripcion:... Valor de retomo:.. ‘Mensaje SBM_GETSCROLLINFO Defic a: o.oo Descripeion: Valor de retomno:.... Mensaje SBM_SETPOS Definicién: Descripeion:... Valor de retomo:... Observacione Mensaje SBM_SETRANGE. Definici6n: one Descripcion:...... Valor de retorno:.... Observaciones (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netMensaje SBM_SETSCROLLINFO. Definicion: orn Descripeién: Valor de retomo:... Mensaje WM_CHAR Definicion: Descripeion: Valor de retorno: Observaciones:.... Mensaje WM_COMMAND ... Definicion: Deseripeion: Valor de retorno: Observaciones..... Mensaje WM_CREATE.. Definicion: Deseripeion:.. Valor de retomo:.. ‘Mensaje WM_DESTR( Definicion: Deseripeién: Valor de retorno:.. Observaciones: sen Mensaje WM_GETMINMAXINFO Definicién: Deseripeién: Valor de retomo: Observaciones.... Mensaje WM_GETTEXT. Definicién: . DeseripeiOn: sr Valor de retorno: Accién por defecto: Observaciones.... Accién por defect Observaciones: . Mensaje WM_HSCROLL ... Definiciéon: Descripein:.... Valor de retorno: Observaciones.... Mensaje WM_INITDIAl Definicion: DeseripeiOn: rr Valor de retorno: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netComentarios: ce Mensaje WM_KEYDOWN, Definicién:....... Accién por defect Observaciones: Valor de retomo:.. Accién por defecto: Observaciones: : Mensaje WM_NCCREATE .. Definicion: Descripein:.... Valor de retorno: Accién por defecto:..... ‘Mensaje WM_NCPAINT.... Definicion: Accién por defecto: Observaciones:... ‘Mensaje WM_PAINT. Definicién...... Accién por defect Observaciones: Mensaje WM_QUIT.... Definicién: Deseripeion Valor de retomo:.. Accién por defect Observaciones: Mensaje WM_SYSCHAR... Definiciéon: Descripein:.... Valor de retorno: Observaciones.... Mensaje WM_SYSCO! Definicion: Deseripeion: Valor de retorno: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netObservaciones? 1. Mensaje WM_| SYSDEADCHAI Definicién Deseripcién: Mensaje WM_SYSKEYDOWN. Definicién: Deseripeién: Valor de retomo:.... Aceién por defecto:..... Observaciones:..... - Mensaje WM_SYSKEYUP. . . . . . . 239 Definicion: Descripcion: Valor de retorno:.. Accién por defect Observaciones... ‘Mensaje WM_TIMER Definicion: Deseripeién: Valor de retorno:.. Observaciones: Mensaje WM_VSCROLL Definicién: Deseripeién: Valor de retomo: Observaciones: Atributos comunes de recurso: Atributos de carga, Atributos de memoria . Sentencia CAPTION. Paramett 0... Sentencia CHARACTERISTICS Parametro...... Sentencia CLASS Parametr os Observaciones:..... CONTROL: Controles Generale: Parametros: Control de clase Button... Control de clase Combobox. Control de clase Edit... Control de clase Listbor Control de clase Serollbar.. Control de clase Static DIALOG. Definicion: Descripcion: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netObservaciones... Sentencia EXSTYLE.. Parametros: Sentencia LANGUAG Parametros: MENU... Definicién.... Deseripeion:.. Sentencia MENUITEM . Parametros: Parmetros Communes de Sentencias . Parametros de los controles communes Parametros: Sentencia POPUP .... Parametros: Sentencia STYLE Pardmetro: Comentarios: Sentencin VERSION Parametr Glosario.. API (Application Programming Interface), OWL y MFC .. GDI (Graphics Device Interface) SDK (Software Development Kit). MAPI (Messaging Application Programming Ineriae) . MDI (Multiple Document Interface). SDI (Single Document Interface). GUI (Graphic User Interface) OEM (original equipment manufacturer)... (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netIntroduccién Requisitos previos: Para el presente curso supondré que ests familiarizado con la programacion en C y C++ y también con las aplicaciones y el entorno Windows, al menos al nivel de usuario, Pero no se requeriran muchos mas conocimientos. El curso pretende ser una explicacién de la forma en que se realizan los programas en Windows usando el API. Las explicaciones de las funeiones y los mensajes del API son meras tradueciones del fichero de ayuda de WIN32 de Microsoft, y s6lo se incluyen como complemento. ‘Vamos a ponernos en antecedentes. Primero veamos algunas caracteristicas especiales de la programacién en Windows. Independencia de la Los programas Windows son independientes de Ia méquina en la que se ejecutan (0 deberian serlo), el acceso a los dispositivos fisicos se hace a través de interfaces, y munea se accede directamente a dispositivos fisicos. Esta es una de las principales ventajas para el programador, no hay que preocuparse por el modelo de tarjeta grafica o de impresora, la aplicacion funcionara con todas, y ser el sistema operativo el que se encargue de que asi sea. Un concepto importante es el de recurso. Desde el punto de vista de Windows, un recurso es todo aquello que puede ser usado por una o varias aplicaciones. Existen recursos fisicos, que son los dispositivos que componen el ordenador, como la memoria, la impresora, el teclado o el ratan y recursos virtuales 0 logicos, como los graficos, los iconos o las cadenas de caracteres. Por ejemplo, si nuestra aplicacién requiere el uso de un puerto serie, primero debe averiguar si esta disponible, es decir, si existe y si no lo esti usando otra aplicacién; y después lo reservar para su uso. Esto es porque este tipo de recurso no puede ser compartido Lo mismo pasa con la memoria 0 con la tarjeta de sonido, aunque son casos diferentes. Por ejemplo, Ia memoria puede ser compartida, pero de una forma general, cada porcién de memoria no puede compartirse, y se trata de un recurso finito. Las tarjetas de sonido, dependiendo del modelo, podrin o no compartirse por varias aplicaciones. Otros recursos como el ratén y el teclado también se comparten, pero se asigna su uso automaticamente a la aplicacidn activa, a la que normalmente nos referiremos como la que tiene el "foco", es decir, a que mantiene contacto con el usuario. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netDesde nuestro punto de vista, como programadores, también consideramos recursos varios componentes como los memtis, los iconos, los cuadros de didlogo, las cadenas de caracteres, los mapas de bits, los cursores, etc, En sus programas, el Windows almacena separados el c6digo y los recursos, dentro del mismo fichero, y estos tiltimos pueden ser editados por separado, permitiendo por ejemplo, hacer versiones de los programas en distintos idiomas sin tener acceso a los ficheros fuente de la aplicacion. MS La forma en que se presentan las aplicaciones Windows (al menos las interactivas) ante el usuario es la ventana, supongo que todos sabemos qué es una ventana: un drea rectangular de la pantalla que se usa de interfaz entre la aplicacién y el usuario. Cada aplicacién tiene al menos una ventana, la ventana principal, y todas las comunicaciones entre usuario y aplicacion se canalizan a través de una ventana. Cada ventana comparte el espacio de Ia pantalla con otras ventanas, incluso de otras aplicaciones, aunque s6lo una puede estar activa, es decir, solo una puede recibir informacién del usuario. Los programas en Windows estin orientados a eventos, esto significa que normalmente los programas estn esperando a que se produzca un acontecimiento que les incumba, y mientras tanto permanecen aletargados o dormidos. Un evento puede ser por ejemplo, el movimiento del ratén, la activacién de un ment, la llegada de informacién desde el puerto serie, una pulsacién de una tecla. Esto es asi, porue Windows es un sistema operativo multitarea, y el tiempo del microprocesador ha de repartirse entre todos los programas que se estén ejecutando. Si los programas fueran secuenciales puros, esto no seria posible, ya que hasta que una aplicacién finalizara, el sistema no podria atender al resto. Inicio Proeeso 1 Proceso 2 Proceso 3 Proveso 4 Final Ejemplo de programa secuencial: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net{ Proceso \,--[ Proceso 2 ‘de | Proceso 2 | meecee/~ [Foote Proceso 4 Ejemplo de programa por eventos: Proyectos Debido a la complejidad de los programas Windows, normalmente los dividiremos en varios ficheros fuente, que compilaremos por separado y enlazaremos juntos. Cada compilador puede tener diferencias, més o menos grandes, para trabajar con proyectos. Sin embargo no deberias tener grandes dificultades para adaptarte a cada uno. En el presente curso trabajaremos con el compilador de "Bloodshed", que es piiblico y gratuito, y puede decargarse de Internet en la siguiente URL: http://www. bloodshed.net/. Para crear un proyecto Windows usando este compilador eligiremos el menti "File/New Project”. Se abriri un cuadro de didélogo donde podremos elegir el tipo de proyecto. Elegiremos "Windows Application” y "C++ Project”. A continuacion pulsamos "Aceptar". El compilador erea un proyecto con un fichero C++, eon el esqueleto de una aplicacién para una ventana, a partir de ahi empieza nuestro trabajo. Convenciones En parte para que no te resulte muy dificil adaptarte a la terminologia de Windows, ya la documentacién existente, y en parte para seguir mi propia costumbre, en la mayoria de los casos me referiré a componentes y propiedades de Windows con sus nombres en inglés. Por ejemplo, hablaremos de "button", “check box", "radio button’, “list box", "combo box" o "property sheet", aunque algunas veces traduzea sus nombre a castellano, por ejemplo, “dialog box" se nombrara a menudo como "euadro de didlogo” Ademis hablaremos a menudo de ventanas “overlapped o superponibles, que son las ventanas corrientes. Para el término "pop-up" he desistido de buscar una traduccién. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netTambién se usaran a menudo, con relacién a "check boxes", términos ingleses como checked, unchecked o grayed, en lugar de marcado, no marcado o gris. Owner-draw, es un estilo que indica que una ventana o control no es la encargada de actualizarse en pantalla, esa responsabilidad es transferida a la ventana duefia del control o ventana, Para "bitmap" se usar a menudo la expresién "mapa de bits”, Los controles son la forma en que las aplicaciones windows se comunican con el usuario, Normalmente se usan dentro de los cuadros de didlogo, pero en realidad pueden usarse en cualquier ventana Existen bastantes, y los iremos viendo poco a poco, al mismo tiempo que aprendemos a manejarlos. Los mas importantes y conocidos son: + control estatic: son etiquetas, marcos, iconos 0 dibujos. + control edit: permiten que el usuario introduzea datos en la aplicacién. + control list box: el usuario puede escoger entre varias opciones de wna lista + control combo box: es una mezcla entre un edit y un list box. + control scroll bar: barras de desplazamiento, para la introduccién de valores entre margenes definidos. + control button: realizan acciones 0 comandos, de button de derivan otros dos controles muy comunes: control check box: permite leer variables de dos estados "checked" 0 "unchecked" control radio button: se usa en grupos, dentro de cada grupo sélo uno puede ser activado. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netCapitulo 1 Componentes de una ventana ‘Veamos ahora los elementos que componen una ventana, aunque mas adelante veremos que no todos tienen por qué estar presentes en todas las ventanas. El borde de la ventana Hay varios tipos, dependiendo de que estén no activas las opciones de cambiar el tamaiio de la ventana, Se trata de un area estrecha alrededor de la ventana que permite cambiar su tamaiio. Barra de titulo Zona en la parte superior de la ventana que contiene el icono y el titulo de la ventana, esta zona también se usa para mover la ventana a través de la pantalla. Loy Ce <= Pequeiia érea cuadrada situada en la parte derecha de la barra de titulo que sirve para disminnir el tamafio de la ventana. Antes de la aparicion del Windows 95 la ventana se convertia a su forma icénica, pero desde la aparicién del Windows 95 se elimina la ventana y s6lo permanece el botdn en la barra de estado. Caja de maximizar. Pequefia rea cuadrada situada en la parte derecha de la barra de titulo que sirve para agrandar la ventana para que ocupe toda la pantalla. Cuando la ventana esta maximizada, se sustituye por la caja de restaurar. Caja de cerra' Pequeiia area cuadrada situada en la parte derecha de la barra de titulo que sirve para cerrar la ventana. Caja de control de menu Pequeita area cuadrada situada en la parte izquierda de la barra de titulo, normalmente contiene el icono de la ventana, y sirve para desplegar el menti del sistema. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net© menti del sistema. Se trata de una ventana especial que contiene las funciones comunes a todas las ventanas, también accesibles desde las cajas y el borde, como minimizar, restaurar, maximizar, mover, cambiar tamaiio y cerrar. Barra de men Zona situada debajo de la barra de titulo, contiene los mentis de la aplicacién. Barra de scroll horizontal. Barra situada en la parte inferior de la ventana, permite desplazar horizontalmente la vista del area de cliente. Barra de scroll vertical. Barra situada en la parte derecha de la ventana, permite desplazar verticalmente la vista del area de cliente. Ta Ce es Es la zona donde el programador sitia los controles, y los datos para el usuario. En general es toda la superficie de la ventana lo que no esta ocupada por las zonas anteriores. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netCapitulo 2 Notacién Hungara La notaci6n hingara es un sistema usado normalmente para crear los nombres de variables cuando se programa en Windows. Es el sistema usado en la programacién del sistema operativo, y también por la mayoria de los programadores. También seré el sistema que usemos en este curso. Consiste en prefijos en mimisculas que se afiaden a los nombres de las variables, y que indican su tipo. El resto del nombre indica, lo mas claramente posible, la funcidn que realiza la variable. fijo Significado b _ Booleano © Cardcter (un byte) [dw Entero largo de 32 bits sin signo (DOBLE WORD) f i 1 Flags empaquetados en un entero de 16 bits Manipulador de 16 bits (HANDLE) Entero largo de 32 bits lp Puntero a entero largo de 32 bits pf Puntero largo a una funcién que devuelve un entero lpsz _ Puntero largo a una cadena terminada con cero in _Entero de 16 bits, p___ Puntero a entero de 16 bits [pt Coordenadas (x, y) empaquetadas en un entero de 32 bits rgb Valor de color RGB empaquetado en un entero de 32 bits (Cadena terminada en cero Entero corto de 16 bits sin signo (WORD) nContador: la variable es un entero que se usara como contador. szNombre: tna cadena terminada con cero que almacena un nombre. ‘Respuesta: una variable booleana que almacena una respuesta. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netCapitulo 3 La funcién "WinMain" La funcién de entrada de un programa Windows es "WinMain", en lugar de la conocida "main". Normalmente, la definicidn de esta funcién cambia muy poco de una aplicaciones a otras. Se divide en tres partes claramente diferenciadas: declaracién, inicializacion y bucle de mensajes. Parametros de entrada de "WinMa int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) La funcion WinMain tiene cuatro pardmetros de entrada: + hinstance es un manipulador para la instancia del programa que estamos ejecutando, Cada vez que se ejecuta una aplicacion, Windows crea una Instancia para ella, y le pasa un manipulador de dicha instaneia a la aplicacién. +hPrevinstance es un manipulador a instancias previas de la misma aplicacién, Como Windows es multitarea, pueden existir varias versiones de la misma aplicacion ejecutandose, varias instancias. En Windows 3.1, este pardmetro nos servia para saber si nuestra aplicacién ya se estaba ejecutando, y de ese modo se podian compartir los datos comunes a todas las instancias. Pero eso era antes, ya que en Win32 usa un segmento distinto para cada instancia yeste parimetro es siempre NULL, s6lo se conserva por motivos de compatibilidad. +IpszCmdParam, esta cadena contiene los arguments de entrada del comando de linea. +nCmdShow, este parametro especifica como se mostraré la ventana. Para ver sus posibles valores consultar valores de nCmdShow. Se recomienda no usar este pardmetro en la funcion Show Window la primera vez que se ésta es llamada. En su lugar debe usarse el valor SW_SHOWDEFAULT. Funcién WinM tipica int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE bPrevinstance, LPSTR IpszCmdParam, int nCmdShow) [ HWND hWnd; MSG Message; WNDCLASS WndClass; WndClass.style = CS_ HREDRAW |CS_VREDRAW; ‘WadClass.lpfinWndProc = WindowProcedure; (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net‘WndClass.cbClsExtra = 0; ‘WndClass.cbWndExtra ‘WndClass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); ‘WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); ‘WndClass.hlcon = LoadIcon(NULL, IDIL_APPLICATION); ‘WndClass.hinstance = hinstance; ‘WndClass.lpszClassName = "NUESTRA_CLASE"; ‘WndClass.lpszMenuName = NULL; RegisterClass(&WandClass); hWnd = CreateWindow( "NUESTRA_CLASE", "Ventana de Ejemplo", WS_OVERLAPPEDWINDOW CW_USEDEFAULT, CW_USEDEFAULT, 320, 200, HWND_DESKTOP, NULL, Instance, NULL ); ShowWindow(hWnd, SW_SHOWDEFAULT); while(TRUE — GetMessage(&Message, 0, 0, 0)) t TranslateMessage(&Message); DispatchMessage( &Message); retum Message.wParam; Declaracion En la primera zona declararemos las variables que necesitamos para auestra funcién WinMain, que como minimo seran tres: +HWND hWnd, un manipulador para la ventana principal de la aplicacién. Ya savemos que nuestra aplicacién necesitara al menos una ventana. + MSG Message, una variable para manipular los mensajes que lleguen a nuestra aplicacién. + WNDCLASS WndClass, una estructura que se usar para registrar la clase particular de ventana que usaremos en nuestra aplicacion. Inicializacion (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netEsta zona se encarga de registrar Ia clase, crear la ventana y visualizarla en pantalla. Para registrar la clase primero hay que rellenar adecuadamente la estructura WNDCLASS, que define algunas caracteristicas que seran comunes a todas las ventanas de una misma clase, como color de fondo, icono, menii por defecto, el procedimiento de ventana, ete. Después hay que lamar a la funcién RegisterClass. A continuacién se crea la ventana usando la funcién CreateWindow, que nos devuelve un manipulador de ventana, Pero esto no muestra la ventana en la pantalla, Para que la ventana sea visible hay que llamar a la funcién ShowWindow. La primera vez que se llama a ésta funcién, después de crear la ventana, se puede usar el pardmetro nCmdShow de WinMain como parémetro o mejor ain, como se recomienda por Windows, el valor SW_SHOWDEFAULT. Bucle de mensajes Este es el nucleo de la aplicacién, como se ve en el ejemplo el programa permanece en este bucle mientras la funcién GetMessage retorne con un valor TRUE. whille(GetMessage(&Message, 0, 0, 0)) { Translate Message( &Message); DispatchMessage( &Message); } Este bucle no es recomendable, aunque se usa muy habitualmente. La razon es que Ja funcion GetMessage puede retornar tres valores: TRUE, FALSE 0 -1. El valor -1 indica un error, asi qne en este caso se deberia a bandonar el bucle. Seria mas apropiado un bucle como este: while(TRUE — GetMessage(&Message, 0, 0, 0)) { TranslateMessage( &Message); DispatchMessage( &Message); La funcién TranslateMessage se usa para traducir los mensajes de teclas virtuales a mensajes de cardcter. Las teclas virtuales son las teclas de funcién, las teclas de las flechas, y las combinaciones de teclas de caracteres o niimeros con las teclas ALT y CONTROL. Los mensajes traducidos se reenvian a la lista de mensajes del proceso, y se recuperardn con las siguientes llamadas a GetMessage. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netLa finci6n DispatchMessage envia el mensaje al procedimiento de ventana, donde ser tratado adecuadamente. El proximo capitulo esté dedicado al procedimiento de ventana, y al final de él estaremos en disposicidn de crear nuestro primer programa Windows. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netCapitulo 4 El procedimiento de ventana Cada ventana tiene una funcién asociada, ésta funcién se conoce como procedimiento de ventana, y es la encargada de procesar adecuadamente todos los mensajes enviados a una determinada clase de ventana. Es la responsable de todo lo relativo al aspecto y al comportamiento de una ventana. ‘Normalmente, estas funciones estan basadas en tna estructura "switch" donde cada "case" corresponde aun determinado tipo de mensaje. LRESULT CALLBACK WindowProcedure( HWND hwnd, _// Manipulador de ventana UINT msg, _// Mensaje WPARAM wParam, // Pardmetro palabra, varia LPARAM lParam // Parimetro doble palabra, varia 3 hwnd es el manipulador de la ventana a la que est destinado el mensaje. «msg es el cédigo del mensaje. + wParam es el parimetro de tipo palabra asociado al mensaje. + [Param es el parimetro de tipo doble palabra asociado al mensaje. Para mas detalles sobre la funcién de procedimiento de ventana, consultar WindowProe. Prototipo de procedimiento de ventana LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); Implementaci6n de procedimiento de ventana simple /* Esta funcién es llamada por la funcién del API DispatchMessage() */ LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM IParam) switch (msg) ** manipulador del mensaje */ t case WM_DESTROY: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netPostQuitMessage(0); _/* envia un mensaje WM_QUIT ala cola de mensajes */ brea default: /* para los mensajes de los que no nos ocupamos */ return DefWindowProc(hwnd, msg, wParam, Param); } return 0; } En general, habré tantos procedimientos de ventana como programas diferentes y todos serdn distintos, pero también tendran algo en comin: todos ellos procesarin los mensajes que lleguen a una ventana. En este ejemplo sélo procesamos un tipo de mensaje, se trata de WM_DESTROY que es el mensaje que se envia a una ventana cuando se recibe un comando de cerrar, ya sea por menti o mediante el icono de aspa en Ia esquina superior derecha de la ventana, Este mensaje s6lo sirve para informar a la aplicacién de que el usuario tiene la intencién de abandonar la aplicacidn, y le da una oportunidad de dejar las cosas en su sitio: cerrar ficheros, liberar memoria, guardar variables, etc. Incluso, la aplicacion puede decidir que atin no es el momento adecuado para abandonar la aplicacién. En el caso del ejemplo, efectivamente cierra la aplicacién, y lo hace enviéndole un mensaje WM_QUIT, mediante la funcién PostQuitMessage El resto de los mensajes se procesan en el caso “default”, y simplemente se cede su tratamiento a la funcién del API que hace el proceso por defecto para cada mensaje, DefWindowProe. Este es el camino que sigue el mensaje WM_QUIT euando llega, ya que el proceso por defecto para este mensaje es cerrar la aplicacién. En posteriores capitulos veremos como se complica paulatinamente esta funcidn, afiadiendo mas y mas mensajes. Primer ejemplo de programa Windows ‘Ya estamos en condiciones de crear nuestro primer programa Windows, que s6lo mostraré una ventana en pantalla. a Ejemplo 1: ejemplol.c 7/12/2000 (1.779 bytes) “” (Altemativo: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netCapitulo 5 Mends 1 Ahora que ya sabemos hacer el esqueleto de una aplicacion Windows, veamos el primer medio para comunicarnos con ella. ‘Supongo que todos sabemos lo que es un ment: se trata de una ventana un tanto especial, del tipo pop-up, que contiene una lista de comandos u opciones entre las cuales el usuario puede elegit. Cuando se usan en una aplicaciéa, normalmente se agrupan varios memis bajo una barra horizontal, (que no es otra cosa que un ment), dividida en varias zonas 0 items, Cada item de un meni que tenga asociado un comando 0 un valor, es decir todos menos los separadores y aquellos que despliegan nuevos mentis, tiene asociado un identificador. Este valor se usa por la aplicaciOn para saber qué opeién se active por el usuario, y decidir las acciones a tomar en consecuencia Existen varias formas de afadir un meni a una ventana, veremos cada una de ellas por separado. Es posible desactivar algunas opciones para que no estén disponibles para el usuario, Usando las funciones para inserci6n TU Este es el sistema mas rudimentario, pero como ya veremos en el futuro, en ocasiones puede ser muy itil. Empezaremos viendo éste sistema porque ilustra mucho mejor la estructura de los mentis. Tomemos el ejemplo del capitulo anterior y definamos algunas constantes: #define CM_PRUEBA 100 #define CM_SALIR 101 Y afiadamos la declaracién de una funcién en la zona de prototipos: void InsertarMenu(HWND); Al final del programa afiadimos la definicién de esta funcién: void InsertarMenu(HWND hWnd) { HMENU hMenul, hMenu2. hMenul = CreateMenu(); // Manipulador de la barra de ment (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.nethMemu2 = CreateMenu(); // Manipulador para el primer mentt pop-up AppendMenu(hMenu2, MF_STRING, CM_PRUEBA, "&Prueba"); // Item 1 del ment ‘AppendMenu(hMenu2, MF SEPARATOR, 0,NULL); _// Item 2 del mena (separador) ‘AppendMenu(hMenu2, MF_STRING, CM_SALIR, "&Salir"); // Item 3 del meni ‘AppendMenu(hMenul, MF_STRING | MF POPUP, (UINT)hMenu2, "Principal"; // Insercién del menti pop-up SetMenu (hWnd, hMemul); // Asigna el ment a la ventana hWnd } Y por iiltimo, slo nos queda llamar a nuestra funcién, insertaremos ésta llamada justo antes de visualizar la ventana. InsertarMenu(hWnd); ShowWindow(hWnd, SW_SHOWDEFAULT); ‘Veamos cémo funciona "InsertarMenu". La primera novedad son las variables del tipo HMENU. HMENU es un tipo de manipulador especial para mentis. Necesitamos dos variables de este tipo, una para manipular la barra de mend, hMenul. La otra para manipular cada uno de los meniis pop-up, en este caso s6lo uno, hMenu2. De momento haremos una barra de menti con un tinico elemento que sera un ment pop-up. Después veremos como implementar mentis mas complejos. Para crear un ment usaremos la funcién CreateMenu, que crea un menti vacio. Para ir afiadiendo items a cada meni usaremos la funcion AppendMenu. Esta funeién tiene varios argumentos, el primero es el mem donde queremos insertar el nuevo item. El segundo son las opciones o atributos del nuevo item, por ejemplo MF_STRING, indica que se trata de un item de tipo texto, MF_SEPARATOR, es un item separador y MF_POPUP, indica que se trata de un meni que desplegara un nuevo menit pop-up. El siguiente parimetro puede tener distintos significados: «Puede ser un identificador de comando, éste identificador se usara para comunicar a la aplicacién si el usuario seleciond un determinado item. + Un manipulador de menii, si el item tiene el flag MF_POPUP, en éste caso hay que hacer un casting a (UINT). + Opuede ser cero, si se trata de un separador. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netEL iiltimo parimetro es el texto del item, cuando se ha especificado el flag ME STRING, mas adelante veremos que los items pueden ser también bitmaps. Normalmente se trata de una cadena de texto, Pero hay una peculiaridad interesante, para indicar la tecla que activa un determinado item de un menti se muestra la letra correspondiente subrayada. Esto se consigue insertando un '&" justo antes de la letra que se quiere usar como atajo, por ejemplo, en el item "&Prueba" esta letra sera la 'P'. Por filtimo SetMenu, asigna un ment a una ventana determinada, El primer parémetro es el manipulador de la ventana, y el segundo el del meni. Prueba estas fimnciones y juega un rato con ellas. En la sigiente pagina veremos como hacer que nuestra aplicacién responda a los mensajes del meni, Antes de complicar més nuestros mentis, veamos como hacer que nuestra aplicacién se de cuenta de que el usuario ha activado una opcién del mem. ¥ para que nos lo notifique a nosotros usaremos un cuadro de mensaje. Uso basico de MessageBox Antes de aprender a visualizar texto en la ventana, usaremos un mecanismo més simple para informar al usuario de cualquier cosa que pase en nuestra aplicaciéa. Este mecanismo no es otro que el cuadro de mensaje (message box), que consiste en una pequeiia ventana con un mensaje para el usuario y uno o varios botones, segiin el tipo de cuadro de mensaje que usemos. En nuestros primeros ejemplos, el cuadro de mensaje sélo incluiré el botén de "Aceptar". Para visualizar un cuadro de mensaje simple, usaremos la funcién MessageBox. En nuestros ejemplos bastard con la siguiente forma: MessageBox(hWnd, "Texto de mensaje", "Texto de titulo", MB_OK); Esto mostrard un pequelio cuadro de diilogo con ¢ el texto y el titulo especificados yun botén de "Aceptar", El cuadro se cerrara al pulsar el bot6n o al pulsar la tecla de Retomno, Respondiendo a los mensajes del Cosn Las activaciones de los meniis se reciben mediante un mensaje WM_COM! Para procesar estos mensajes, cuando sélo podemos recibir mensajes desde un ‘ment, tinicamente nos interesa la palabra de menor peso del parémetro wParam del mensaje Modifiquemos el procedimiento de ventana para procesar los mensajes de nuestro meni: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netLRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM [Param) switch (msg) /* manipulador del mensaje * { case WM_COMMAND: switeh(LOWORD(wParam)) { case CM_PRUEBA: MessageBox(hwnd, "Comando: Prueba’, "Mensaje de ment MB_OK); break; case CM_SALIR: MessageBox(hwnd, "Comando: Salir", "Mensaje de meni", MB_OK); PostQuitMessage(0); /* envia un mensaje WM_QUIT a la cola de mensajes */ break; 3 break; case WM_DESTROY: PostQuitMessage( mensajes */ break; default: * para los mensajes de los que no nos ocupamos */ returm DefWindowProc(hwnd, msg, wParam, IParam); /* envia un mensaje WM_QUIT a la cola de return 0; 5 Sencillo, ;n0?. Observa que hemos usado la macro LOWORD para extraer el identificador del item del pardmetro wParam. Después de eso, todo es més ficil. ‘También se puede ver que hemos usado la misma funcion para salir de la aplicacién que para el mensaje WM_DESTROY: PostQuitMessage. Ejemplo de programa Windows con Cok=i0l4 Este ejemplo contiene todo lo que hemos visto sobre los ments hasta ahora, Ejemplo 2: ejemplo2.¢ 18/12/2000 (2.750 bytes) e (Altemativo: e ) Veamos ahora una forma mas sencilla y mas habitual de implementar menus. Ficheros de recursos: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netLo normal es implementar los mentis desde un fichero de recursos, el sistema que hemos visto s6lo se usa en algunas ocasiones, para crear o moficiar ments durante la ejecucién de la aplicacién. Es importante adquirir algunas buenas costumbres cuando se trabaja con ficheros de recursos. 1. Usaremos siempre etiquetas como identificadores para los items de los meni. 2. Crearemos un fichero de cabecera con las definiciones de los identificadores, en nuestro ejemplo se llamar "ids.h" 3. Incluiremos éste fichero en el fichero de recursos y en el cédigo fuente de nuestra aplicacién, Partimos de un proyecto nuevo: win3. Pero usaremos el cédigo modificado del ejemplol Para ello creamos un nuevo proyecto de tipo GUI, al que llamaremos Win3, y copiamos el contenido de "ejemplol.c" en el fichero "untitled1", al que renombraremos como “ejemplo3.c". A continuaci6n crearemos el fichero de identificadores. Afiadimos el fichero de cabecera a nuestro proyecto. Si estas usando Dev-C+, ésto se hace pulsando con el botén derecho del ratén sobre el nodo del proyecto y eligiendo el item de "new item in project" en el mena pop-up que se despliega. Después lo renombramos, el mecanismo es similar, pulsamos con el boton derecho sobre el item "untitled2” y elegimos la opcién de "rename file" del ment pop-up que se despliegue. Como nuevo nombre elegimos: "ids.h. Pinchando sobre el item del nuevo fichero éste se abrira. Introducimos los identificadores: #tdefine CM_PRUEBA 100 #define CM_SALIR 101 En el fichero "ejemplo3.c" aiiadimos la linea: #include "ids.h" Justo después de la linea "#include
". Ahora editaremos el fichero de recursos. Para ello pulsamos con el boton derecho del ratén sobre el item del proyecto y elegimos el item de menti "edit resource file". En [a primera linea, antes de la que comienza con "500 ICON...", introducimos la linea’ (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netinclude "ids.h" Movemos el cursor a la linea 3 y escribimos: Menu MENU BEGIN POPUP "&Principal” BEGIN MENUITEM "&Prueba", ID_ PRUEBA MENUITEM SEPARATOR MENUITEM "&Salir", ID_SALIR END END Ya podemos cerrar el cuadro de edicién del fichero de recursos. Para ver mas detalles sobre el uso de este recurso puedes consultar las claves: MENU, POPUP y MENUITEM. (eye Uet- La Co MR Che eK I (BUCH) Ahora tenemos varias opciones para usar el menti que acabamos de crear. Primero veremos como cargarlo y asignarlo a nuestra ventana, ésta es la forma que mis se parece a la del ejemplo del capitulo anterior. Para ello basta con insertar éste cddigo antes de Hamar a la funcion Show Window: HMENU bMenu; Menu = LoadMenu(hlnstance, "Menu"); SetMenu (hWnd, hMemu); O simplemente: SetMenu (hWnd, LoadMenu(hInstance, "Menu")); La funcin LoadMenu se encarga de cargar el recurso de menti, para ello hay que proporcionarle un manipulador de la instaneia a la que pertenece el recurso y el nombre del ment. Otro sistema, més sencillo todavia, es asignarlo como memt por defecto de la clase. Para esto basta con la siguiente asignacién: ‘WndClass.IpszMenuName = "Menu"; (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netY por tiltimo, también podemos asignar un menti cuando creamos la ventana, especificéndolo en la llamada a CreateWindow: hWad = CreateWindow( "NUESTRA_CLASE", "Ventana de Ejemplo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320, 200, HWND_DESKTOP, LoadMenu(hinstance, "Menu"), // Carga y asignacién de meni hInstance, NULL ds El tratamiento de los comandos procedentes del menti es igual que en el apartado anterior. Ejemplo 3: ejemplo3.c 24/12/2000 (1.927 bytes) ids.h 24/12/2000 (47 bytes) rsre.re 24/12/2000 (275 bytes) a win3.dev 24/12/2000 (406 bytes) *” (Altemative: *~ ) (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netCapitulo 6 Diadlogo basico Los cuadros de didlogo son la forma mas habitual de comunicacion entre una aplicacion Windows y el usuario. Para facilitar la tarea del usuario existen varios tipos de controles, cada uno de ellos disefiado para un tipo especifico de informacién. Los mas comunes son los "static", "edit", "button", "listbox", "scroll", "combobox", "group", "checkbutton” y "ratiobutton”. A partir de Windows 95 se indrodujeron varios controles nuevos: "updown", "listview", "treeview", "gauge", "tab" y "trackbar". En realidad, un cuadro de didlogo es una ventana normal, aunque con algunas peculiaridades, tiene su procedimiento de ventana, pero puede devolver un valor a Ja ventana que lo invoque. Igual que los memis, los cuadros de didlogo se pueden construir durante la ejecucién o a partir de un fichero de recursos. Ficheros de recursos: La mayoria de los compiladores de C/C++ que ineluyen soporte para Windows poseen herramientas para la edicién de recursos: ments, dislogos, bitmaps, ete. Sin embargo considero que es interesante que aprendamos a construir nuestros recursos conn editor de textos, cada compilador tiene sus propios editores de recursos, y no tendria sentido explicar cada uno de ellos. El compilador que usamos "Dev C++" tiene un editor muy limitado y no aconsejo su uso De modo que aprenderemos a hacer cuadros de didlogo igual que hemos aprendido a hacer memis, usando sélo texto. Para el primer programa de ejemplo de programa con didlogos, que seré el ejemplo 4, partiremos de nuevo del programa del ejemplo 1. Nuestro primer didlogo sera muy sencillo: un simple cuadro con un texto y un botén de "Aceptar". Este es el cédigo del fichero de recursos: #include
#include "IDS.H" Menu MENU BEGIN POPUP "&Principal” BEGUIN MENUITEM "&Dialogo”, CM_DIALOGO, END END DialogoPrueba DIALOG 0, 0, 118, 48 (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netSTYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Dialogo de prueba" FONT 8, "Helv" BEGIN CONTROL "Mensaje de pruebi WS_VISIBLE, 8, 9, 84, 8 CONTROL "Aceptar", IDOK, "button", BS_ PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 56, 26, 50, 14 END "static", SS_LEFT | WS_CHILD | ‘Necesitamos ineluir el fichero "windows.h" ya que en él se definen muchas constantes, como por ejemplo "IDOK" que ¢s el identificador que se usa para el botén de "Aceptar" También necesitaremos el fichero "ids.h", para definir los identificadores que usaremos en muestro programa, por ejemplo el identificador del dislogo: "DialogoPrueba". /* Identificadores "/ /* Identificadores de comandos */ #define CM_DIALOGO 101 Lo primero que hemos definido es un menti para poder comunicarle a nuestra aplicacién que queremos abrir un cuadro de didlogo. ‘A continuacién esta la definicién del didlogo, que se compone de varias lineas. Puedes ver mas detalles en el apartado de recursos dedicado a DIALOG. De momento bastard con un identificador, como el que usabamos para los mentis; y ademis las coordenadas y dimensiones del didilogo. En cuanto a los estilos, las constantes para definir los estilos de ventana, que comienzan con "WS_", puedes verlos con detalle en la seccién de constantes los de ventana". ¥ los estilos de didlogos, que comienzan con "DS_", en “estilos de dialogo”. Para empezar, hemos definido los siguientes estilos: +DS_MODALFRAME: indica que se crear un cuadro de didlogo con un marco de dialog-box modal que puede combinarse con una bara de titulo y un ment de sistema. + WS POPUP: crea una ventana "pop-up’. + WS_VISIBLE: crea una ventana inicialmente visible. + WS_CAPTION: crea una ventana con una barra de titulo, (ineluye el estilo WS_BORDER). (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netLa siguiente linea es la de CAPTION, en ello especificaremos el texto que aparecera en la barra de titulo del didlogo. La linea de FONT sirve para especiticar el tamaiio y el tipo de fuente de caracteres, que usara nuestro didlogo. Después esté la zona de controles, en nuestro ejemplo sélo hemos ineluido un texto estitico yun botén. Un control estitico (static) nos sirve para mostrar textos o rectangulos, que podemos usar para informar al usuario de algo, como etiquetas o como adomo. Para mas detalles ver controles static. CONTROL "Mensaje de prueba”, WS_VISIBLE, 8, 9, 84, 8 , "static", SS_LEFT | WS_CHILD | + CONTROL es una palabra clave que indica que vamos a definir un control. +A continuacién, en el parémetro text, introducimos el texto que se mostrard, + id es el identificador del control. Como los controles static no se suelen manejar por las aplicaciones no necesitamos un identificador, asi que ponemos -1 + class es la clase de control, en nuestro caso "static". + style es el estilo de control que queremos, En nuestro caso es una compinacién de un estilo static y varios de ventana oSS_LEFT: indica un simple rectngulo y el texto suministrado se alinea en su interior a la izquierda. WS_CHILD: crea el control como una ventana hija WS_VISIBLE: crea una ventana inicialmente visible. + coordenada x del control. + coordenada y del control. + width: anchura del control height: altura del control. El control button nos sirve para comunicamos con el dilogo, podemos darle comandos del mismo tipo que los que proporciona un menti, Para més detalles ver controles button. CONTROL "Aceptar", IDOK, "button", BS_ PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 56, 26, 50, 14 + CONTROL es una palabra clave que indica que vamos a definir un control. +A continuacién, en el parimetro text, introdueimos el texto que se mostrar en ‘su interior. + id es el identificador del control. Nuestra aplicacién recibira este identificador junto con el mensaje WM_COMMAND cuando el usuario active el boton. La etiqueta IDOK esti definida en el fichero Windows.h. + class es la clase de control, en nuestro caso "button". «style es el estilo de control que queremos, En nuestro caso es una compinacién de varios estilos button y varios de ventana: (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net©BS_PUSHBUTTON: crea un botén corriente que envia un mensaje WM_COMMAND au ventana padre cuando el usuario selecciona el botén, ©BS_CENTER: centra el texto horizontalmente en el érea del bot6n, oWS_CHILD: crea el control como una ventana hija. oWS_VISIBLE: crea una ventana inicialmente visible. oWS_TABSTOP: define un control que puede recibir el foco del teclado cuando el usuario pulsa la tecla TAB. Presionando la tecla TAB, el usuario mueve el foco del teclado al siguiente control con el estilo WS_TABSTOP, + coordenada x del control. + coordenada y del control. + width: anchura del control. height: altura del control, Procedimiento de logo: Como ya hemos dicho, un didlogo es basicamente una ventana, y al igual que aquella, necesita un procedimiento asociado que procese los mensajes quele sean enviados, en este caso, un procedimiento de didlogo. BOOL CALLBACK DialogProc( HWND hwndDlg, —_// manipulador del cuadro de didlogo UINT uMsg, J mensaje WPARAM wParam, _// primer parimetro del mensaje LPARAM IParam —_// segundo parametro del mensaje ’ shwndDig identifica el cuadro de didlogo y es el manipulador de la ventana a la que esti destinado el mensaje. «msg es el cédigo del mensaje. + wParam es el parimetro de tipo palabra asociado al mensaje. + [Param es el parimetro de tipo doble palabra asociado al mensaje. La diferencia con el procedimiento de ventana que ya hemos visto esté en el tipo de valor de retorno, que es el caso del procedimiento de didlogo es de tipo booleano. Excepto en la respuesta al mensaje WM_INITDIALOG, el procedimiento de diflogo debe retomar con un valor no nulo si procesa el mensaje y cero si no lo hace. Cuando responde a un mensaje WM_INITDIALOG, el procedimiento debe retornar cero si llama a la funcién SetFocus para poner el foco a uno de los controles del cuadro de didlogo. En otro caso, debe retomar un valor distinto de cero, y en ese caso el sistema pondré el foco en el primer control del didlogo que pueda recibirlo. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netProto’ de procedimiento de logo LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM): ‘Nuestro ejemplo es muy sencillo, ya que nuestro diilogo sélo puede proporcionar ‘un comando, asi que s6lo debemos responder a un tipo de mensaje WM_COMMAND yal mensaje WM_INITDIALOG. Segiin hemos explicado un poco més arriba, del mensaje WM_INITDIALOG debemos retornar con un valor distinto de cero si no Ilamamos a SetFocus, como es rustro caso. Este mensaje lo usaremos para inicializar nuestro didlogo antes de que sea visible para el usuario, cuando haya algo que inicializar, claro. Cuando procesemos el mensaje WM_COMMAND, que sera siempre el que procede del tinico botén del dilogo, cerraremos el didlogo llamando a la funcién EndDialog y retomaremos con un valor distinto de cero. En cualquier otto caso retornamos con FALSE, ya que no estaremos procesando el mensaje. ‘Nuestra funcién queda asi: BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM IParam) WORD status; switch (msg) ** manipulador del mensaje */ t case WM_INITDIALOG: return TRUE; case WM_COMMAND: EndDialog(hDlg, FALSE); return TRUE; } return FALSE; 5 Bueno, s6lo nos falta saber como creamos un cuadro de didlogo. Para ello usaremos un comando de mem, por lo tanto, el didlogo se activard desde el procedimiento de ventana, (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netLRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM IParam) t static HINSTANCE hinstance; switch (msg) * manipulador del mensaje */ { case WM_CREATE: hnstance = ((LPCREATESTRUCT)IParam)->blnstance; return 0; break; case WM_COMMAND: if(LOWORD(wParam) = CM_DIALOGO) DialogBox(hInstance, "DialogoPmueba", hwnd, &D1gProe); break; case WM_DESTROY: PostQuitMessage(0); /* envia un mensaje WM_QUIT a la cola de mensajes */ break; default: * para los mensajes de los que no nos ocupamos */ return DefWindowProe(hwnd, msg, wParam, IParam); } return 0; } En este procedimiento hay varias novedades. Primero hemos declarado una variable estitica "hinstance” para tener siempre a mano un manipulador de la instaneia actual. Para inicializar este valor hacemos uso del mensaje WM_CREATE, que se envia a una ventana cuando es ereada, antes de que se visualize por primera vez. Aprovechamos es hecho de que nuestro procedimiento de ventana sélo recibe una vez.este mensaje y de que lo hace antes de poder recibir ningin comando. En el futuro veremos que se usa para toda clase de inicializaciones El mensaje WM_CREATE tiene como parimetro en [Param un puntero a una estructura CREATESTRUCT que contiene informacién sobre la ventana, en nuestro caso sélo nos interesa el campo hlnstance. La otra novedad es la llamada a la funcién DialogBox, que es la que crea el cuadro de dialogo. Esta funcidn necesita varios parimetros: 1. Un manipulador a la instancia de la aplicacién, que hemos obtenido al procesar el mensaje WM_CREATE. 2. Un identificador de recurso de didlogo, este es el nombre que utilizamos para el didlogo al crear el recurso, entre comillas. (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net3. Un manipulador a la ventana a la que pertenece el didlogo. 4. Y la direceion del procedimiento de ventana que hard el tratamiento del didlogo. Y ya tenemos nuestro primer ejemplo del uso de didlogos, en capitulos siguientes empezaremos a conocer mas detenidamente cémo usar cada uno de los controles basicos: Edit, List Box, Scroll Bar, Static, Button, Combo Box, Group Box, Check Button y Radio Button. Le dedicaremos un capitulo a cada uno de ellos. Ejemplo 4: 16/01/2001 ejemplo4.c 16/01/2001 (2.569 bytes) ids.h 7/01/2001 (86 bytes) rsre.re 16/01/2001 (481 bytes) wind dev 16/01/2001 (366 bytes) (Alternativo: ) (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netCapitulo 7 Control basico Edit Tal como hemos definido nuestro didlogo en el capitulo 6, no tiene mucha utilidad. Los didlogos se usan para intercambiar informacion entre la aplicacién y el usuario, en ambas direcciones. El ejemplo 4 s6lo lo hace en una de ellas. En el capitulo anterior hemos usado dos controles (un texto estitico y un boton), aunque sin saber exactamente como funcionan, En éste capitulo veremos el uso del control de ediein. Un control edit es una ventana de control rectangular que permite al usuario introducir y editar texto desde el teclado. Cuando esta seleccionado muestra el texto que contiene y un cursor intermitente que indica el punto de insercién de texto. Para seleccionarlo el usuario puede hacer un click con el ratén en su interior o usar la tecla TAB. El usuario podra entonces introdueir texto, cambiar el punto de insereién, o seleccionar texto para ser borrado © movido usando el teclado o el raton. Un control de este tipo puede enviar mensajes a su ventana padre medienate WM_COMMAND, y la ventana padre puede enviar mensajes a un control edit en un cuadro de didlogo llamando a la funcién SendDigiiemMessage. Veremos algunos de estos mensajes en este capitulo, y el resto el capitulos més avanzados. ichero de recursos Empezaremos definiendo el control edit en el fichero de recursos, y lo afiadiremos a nuestro dialogo de prueba. DialogoPrueba DIALOG 0, 0, 118, 48 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION 2 FONT 8, "Helv" { CONTROL "Texto:", 9, 28,8 CONTROL "", ID_TEXTO, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 36, 9, 76, 12 CONTROL "Aceptar", IDOK, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 56, 26, 50, 14 } "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, Hemos hecho algunas modificaciones més, para empezar, el control static se ha convertido en una etiqueta para el control edit, que indica al usuario qué tipo de informacion debe suministrar. Hemos afiadido el control edit a continuacién del control static. Veremos que el orden en que aparecen los controles dentro del cuadro de didlogo es muy (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.netimportante, al menos en aquellos controles que tengan el estilo WS_TABSTOP, ya que ese orden sera el mismo en que se activen los controles cuando usemos la tecla TAB. Para mas detalles acerca de los controles edit ver controles edit. ‘Veamos cémo hemos definido nuestro control edit: CONTROL "", ID_TEXTO, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE WS_BORDER | WS_TABSTOP, 36, 9, 76, 12 + CONTROL es una palabra clave que indica que vamos a definir un control. +A continuacién, en el pardmetro text, introducimos el texto que se mostrard en el interior del control, en este caso, ninguno. + id es el identificador del control. Los controles edit necesitan un identificador para que la aplicacién pueda acceder a ellos. Usaremos un identificador definido en IDS.h, + class es la clase de control, en nuestro caso "EDIT" «style es el estilo de control que queremos. En nuestro caso es una combinacién de un estilo edit y varios de venta cES_LEFT: indica que el texto en el interior del control se alineara a la izquierda WS CHILD: crea el control como una ventana hija. WS_VISIBLE: crea una ventana inicialmente visible. oWS_BORDER: se crea un control que tiene de borde una linea fina, WS_TABSTOP: define un control que puede recibir el foco del teclado cuando el usuario pulsa la tecla TAB. Presionando la tecla TAB, el usuario mueve el foco del teclado al siguiente control con el estilo WS_TABSTOP, + coordenada x del control. + coordenada y del control. + width: anchura del control. height: altura del control ere (as CeCe) as logo y los Para manejar el control edit desde nuestro procedimiento de diilogo tendremos que hacer algunas modificaciones. Para empezar, los controles edit también pueden generar mensajes WM_COMMAND, de modo que debemos diferenciar el control que originé dicho mensaje y tratarlo de diferente modo segiin el caso, case WM_COMMAND: if(LOWORD(wParam) == IDOK) EndDialog(hDlg, FALSE); return TRUE; En nuestro caso sigue siendo sencillo: slo cerraremos el didilogo si el mensaje WM_COMMAND proviene del botén "Aceptar". (© Febrero de 2.001 Salvador Pozo, salvadorfoconclase.net
También podría gustarte
Cajas de Diálogo
PDF
Aún no hay calificaciones
Cajas de Diálogo
18 páginas
Comandos Neobook
PDF
100% (1)
Comandos Neobook
10 páginas
Unidad 04
PDF
Aún no hay calificaciones
Unidad 04
12 páginas
Bienvenidos A Las API de Windows en VB
PDF
Aún no hay calificaciones
Bienvenidos A Las API de Windows en VB
66 páginas
Manual Visual
PDF
Aún no hay calificaciones
Manual Visual
63 páginas
Palabras Reservadas y Funciones
PDF
Aún no hay calificaciones
Palabras Reservadas y Funciones
92 páginas
Core APIsp
PDF
Aún no hay calificaciones
Core APIsp
825 páginas
Controles Comunes11
PDF
Aún no hay calificaciones
Controles Comunes11
6 páginas
Manual Visual
PDF
Aún no hay calificaciones
Manual Visual
63 páginas
Código para Crear La VENTANA de Un Botón
PDF
Aún no hay calificaciones
Código para Crear La VENTANA de Un Botón
7 páginas
5 WinAPI
PDF
Aún no hay calificaciones
5 WinAPI
113 páginas
Manual Basico de Visual Basic 6
PDF
Aún no hay calificaciones
Manual Basico de Visual Basic 6
62 páginas
VISUAL STUDIO Programacion Facil
PDF
Aún no hay calificaciones
VISUAL STUDIO Programacion Facil
5 páginas
Ejercicio Access Manejo de Msgbox
PDF
Aún no hay calificaciones
Ejercicio Access Manejo de Msgbox
4 páginas
PROGRAMACION CON CODE BLOCKS
PDF
Aún no hay calificaciones
PROGRAMACION CON CODE BLOCKS
13 páginas
Controles Intrínsecos
PDF
Aún no hay calificaciones
Controles Intrínsecos
34 páginas
Funciones y Palabras Reservadas de Visual Basic
PDF
Aún no hay calificaciones
Funciones y Palabras Reservadas de Visual Basic
13 páginas
Programación Windows API Con C++
PDF
Aún no hay calificaciones
Programación Windows API Con C++
268 páginas
Introduccion a C++ Builder
PDF
Aún no hay calificaciones
Introduccion a C++ Builder
29 páginas
Tutorial Introduccion Programacion Avanzada Visual Basic 6 0
PDF
Aún no hay calificaciones
Tutorial Introduccion Programacion Avanzada Visual Basic 6 0
34 páginas
Función MsgBox (Visual Basic para Aplicaciones) - Microsoft Learn
PDF
Aún no hay calificaciones
Función MsgBox (Visual Basic para Aplicaciones) - Microsoft Learn
5 páginas
PROGRAMACION Taller 2 Segundo Trimestre
PDF
Aún no hay calificaciones
PROGRAMACION Taller 2 Segundo Trimestre
4 páginas
Visual Basic - Net: Menús y Cuadros de Diálogo
PDF
Aún no hay calificaciones
Visual Basic - Net: Menús y Cuadros de Diálogo
13 páginas
Interfaz Grafico de Visual Basic 6.0
PDF
100% (1)
Interfaz Grafico de Visual Basic 6.0
11 páginas
Ficha de Práctica Visual Basic 1
PDF
Aún no hay calificaciones
Ficha de Práctica Visual Basic 1
3 páginas
Proyecto Chat Virtual
PDF
Aún no hay calificaciones
Proyecto Chat Virtual
7 páginas
DelphiXE PDF
PDF
Aún no hay calificaciones
DelphiXE PDF
95 páginas
Aprenda Visual Basic Practicando
PDF
83% (6)
Aprenda Visual Basic Practicando
632 páginas
Vbnet 2bn
PDF
Aún no hay calificaciones
Vbnet 2bn
17 páginas
100_Comandos_WLanguage_WX_Guia_Completo_ES_Landscape
PDF
Aún no hay calificaciones
100_Comandos_WLanguage_WX_Guia_Completo_ES_Landscape
9 páginas
MSG Box
PDF
Aún no hay calificaciones
MSG Box
7 páginas
Guia Rapida Visual Basic
PDF
Aún no hay calificaciones
Guia Rapida Visual Basic
86 páginas
Semana 01
PDF
Aún no hay calificaciones
Semana 01
9 páginas
Visual Basic 6.0
PDF
100% (2)
Visual Basic 6.0
20 páginas
Tarea 1
PDF
Aún no hay calificaciones
Tarea 1
12 páginas
Aplicaciones Visual C++
PDF
Aún no hay calificaciones
Aplicaciones Visual C++
20 páginas
Delphi PDF
PDF
Aún no hay calificaciones
Delphi PDF
49 páginas
Visual Basic
PDF
Aún no hay calificaciones
Visual Basic
40 páginas
Funciones y Ejemplos VB
PDF
Aún no hay calificaciones
Funciones y Ejemplos VB
29 páginas
DelphiXE PDF
PDF
Aún no hay calificaciones
DelphiXE PDF
96 páginas
DelphiXE PDF
PDF
Aún no hay calificaciones
DelphiXE PDF
96 páginas
Delphi Xe Manual
PDF
100% (1)
Delphi Xe Manual
96 páginas
Visual Basic PHP Python
PDF
Aún no hay calificaciones
Visual Basic PHP Python
29 páginas
Semana01
PDF
Aún no hay calificaciones
Semana01
7 páginas
Curso de Excel Aplicado A Ingenieria Civil Clase4
PDF
Aún no hay calificaciones
Curso de Excel Aplicado A Ingenieria Civil Clase4
31 páginas
Lección 10: Conceptos Básicos de Programación - Autoplay Media Studio
PDF
Aún no hay calificaciones
Lección 10: Conceptos Básicos de Programación - Autoplay Media Studio
22 páginas
Autoplay Espanol Conceptos Basicos de Programacion Páginas 1 5
PDF
Aún no hay calificaciones
Autoplay Espanol Conceptos Basicos de Programacion Páginas 1 5
5 páginas
Manual Bisual Basic
PDF
Aún no hay calificaciones
Manual Bisual Basic
53 páginas
Este Es Un Código Fuente de Un Editor de Texto Muy Simple Tipo Bloc de Notas
PDF
Aún no hay calificaciones
Este Es Un Código Fuente de Un Editor de Texto Muy Simple Tipo Bloc de Notas
5 páginas
Leccion 01 Inicio Con Visual Basic 2010 Express Edition
PDF
100% (1)
Leccion 01 Inicio Con Visual Basic 2010 Express Edition
9 páginas
Tutorial - Crear Compilador Batch en VB6 by DHCK ONe
PDF
100% (1)
Tutorial - Crear Compilador Batch en VB6 by DHCK ONe
23 páginas
Resumen Controles de Visual Studio
PDF
100% (1)
Resumen Controles de Visual Studio
28 páginas
Diccionario Basico en VB
PDF
Aún no hay calificaciones
Diccionario Basico en VB
24 páginas