You are on page 1of 18

UNIDAD 5: CAJAS DE DIALOGO

CAJAS DE DIALOGO
Las cajas de dilogo son usadas primero como dispositivos de entrada/salida. Como tal, una caja de dilogo puede ser considerada como una "caja negra" de entrada/salida lo que significa que no tienes que saber cmo funciona internamente una caja de dilogo para usarla, slo tienes que saber cmo interactuar con ella. Es un principio de la programacin orientada a objetos llamado encapsulamiento u ocultamiento de la informacin. Si la caja negra es *perfectamente* diseada , el usuario puede emplearla sin tener conocimiento de cmo funciona. Lo nico es que la caja negra debe ser perfecta, algo difcil de alcanzar en el mundo real. La API de Win32 tambin ha sido diseada como una caja negra. Las cajas de dilogo han sido diseadas para reducir la carga de trabajo del programador. Normalmente si se tiene que poner controles de ventanas hijas sobre una ventana normal, hay que subclasificarlas y escribir uno mismo la lgica del teclado. Pero si se ponen en una caja de dilogo, Windows manejar la lgica por t. Slo hay que saber cmo obtener la entrada del usuario de la caja de dilogo o como enviar rdenes a ella. Como el men, una caja de dilogo se define como un recurso. Se escribe una plantilla describiendo las caractersticas de la caja de dilogo y sus controles y luego se compila el guin de recursos con un compilador de recursos.

LIBRERA COMCTL32
Windows nos provee de muchos recursos, pero ya que hay muchos, cargarlos todos en memoria y registrarlos sera un despilfarro de recursos. Todos ellos, con excepcin del control "rich edit", estn almacenados en comctl32.dll, desde donde las aplicaciones pueden cargarlas cuando se quiera usarlos. El control "rich edit" reside en su propia dll, richedXX.dll. Para cargar comctl32.dll se incluye una llamada a InitCommonControls en tu programa.
InitCommonControls es una funcin en comctl32.dll, as que refirindola en cualquier parte del cdigo de tu programa har que el cargador de archivos cargue comctl32.dll cuando corra tu programa. Esta funcin no hace NADA! Su unica instruccin es "ret". Su nico propsito es incluir la referencia a comctl32.dll en la seccin de importacin de manera que el caragador de archivos la cargue cada vez que el programa sea cargado. El verdadero caballo de batalla es el punto de entrada de la funcin en la DLL que registra todas las clases de controles comunes cuando es cargada la dll. Los controles comunes son creados sobre la base de esas clases as como los controles de ventana hija tales como "edit", "listbox", etc.

CAJAS DE DIALOGO
Todos los recursos se encuentran en el mismo archivo de guin de recursos. Se Puede emplear cualquier editor de texto para escribir un guin de recursos, pero no es recomendable. Hay que usar un editor de recursos para hacer la tarea visualmente ya que arreglar la disposicin de los controles en la caja de dilogo es una tarea difcil de hacer manualmente. Utilizaremos el editor de recursos que viene con el RadASM se puede crear en forma fcil y rpida con estos pasos:
1. 2. 3. 4.

En el men archivo, seleccione Nuevo Proyecto Escriba el nombre y descripcin del proyecto En el asistente de proyectos en la parte de plantilla seleccione DialogApp.tpl Presione aceptar hasta que termine el asistente de proyectos

Se genera un proyecto de caja de dialogo, con archivos .asm, .inc, .dlg y .rc Si se corre este proyecto, se genera una caja de dialogo con el caption con el nombre del archivo .dlg

FUNCION DialogBoxParam
El cdigo para mostrar una ventana simple utilizando las cajas de dialogo es ms sencillo que cuando lo hacemos con puras APIS. En el cdigo generado podemos ver el uso de la funcion API DialogBoxParam, que se encuentra en la librera user32.lib: int DialogBoxParam( HANDLE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam

// manipulador a la instancia de la aplicacin // identifica el recurso de cuadro de dilogo // manipulador a la ventana propietaria // direccin del procedimiento de dilogo // valor de inicializacin );

Esta funcin es la principal en nuestro programa, por que es la causante de mostrar la ventana que esta en el recurso y adems ubicar la direccin donde se encuentra los procesos de ella, veamos para que sirva cada uno de los parmetros. dwInitParam.- Definimos con que valor queremos que tenga al inicio el parmetro lParam, esto no se usara en nuestro programa y colocaremos el valor NULL.

FUNCION DialogBoxParam
DialogBoxParam, hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL hInstance.- Especificamos el manejador de la instancia del modulo. lpTemplate.- Especificamos el ID de nuestra caja de dialogo, ese ID nosotros lo podemos determinar en las propiedades de la caja: El ID de nuestra caja es 101 y el nombre es IDD_DIALOG1, ese datos lo debemos declarar en nuestro archivo INC en la seccin const:

hWndParent.- Definimos el handle de donde pertenece la ventana, aqu ponemos NULL por ser nuestra ventana principal, si en caso fuera la segunda ventana especificaremos el handle de la primera ventana (padre). lpDialogFunc.- Definimos la direccin de la etiqueta donde se encuentra los procedimientos. DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

PROCEDIMIENTO DE DIALOGO
DlgProc proc hWin:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM Mov eax,uMsg .if eax==WM_INITDIALOG .elseif eax==WM_COMMAND .elseif eax==WM_CLOSE invoke EndDialog,hWin,0 .else Mov eax,FALSE ; movemos a EAX el valor 0 para reciclar los mensajes que no utilizamos, ; si no hacemos esto, no ser compatible con window Xp y NT ret .endif Mov eax,TRUE ret DlgProc endp
Como observamos este procedimiento es similar a los procesos de las ventanas con puras APiS que hemos creado en el capitulo anterior, porque toda ventana maneja los mismos mensajes con excepcin de algunos que son solo para Dialog como por ejemplo WM_INITDIALOG, este mensaje se enva antes de mostrar la caja de dialogo en el escritorio, Para diferenciar los mensajes que son solo para cajas de dilogo, se pone la palabra DIALOG al final del mensaje.

CAJAS DE DIALOGO CON BOTONES


1. 2. 3. 4.

5. 6. 7. 8. 9.

Abra el recurso *.dlg. Seleccione el control botn y ubique dos dentro de la caja de dilogo. Importante: Identificar el ID de los botones Cambie el nombre (name) a boton01 y boton02. En el archivo *.inc declare estos nombres como constantes y asgneles su ID, de esta manera podremos referirnos a los botones por el nombre asignado. En el archivo *.asm ubquese en DlgProc. Pase a edx wParam (La variable wparam contiene el ID del control que seleccionemos). Ponga el cdigo correspondiente a la accin a realizar por boton01 y boton02. Para salir de la caja de dilogo, ponga la siguiente instruccin: invoke EndDialog, hWin,0 En el archivo *.inc declare el texto y caption de la ventana

CAJAS DE DIALOGO CON BOTONES


10. 11.

Para cambiar el ttulo de los botones, cambie el caption de cada uno de ellos en el archivo *.inc Para cambiar el caption de la caja de dilogo, cambie el caption del objeto en el archivo *.inc

EXTRACCION DEL CODIGO DE NOTIFICACION


mov eax,wParam mov edx,eax shr edx,16 .IF dx==BN_CLICKED .if ax == boton01 .elseif ax == boton02 .endif .endif BN_CLICKED este cdigo de notificacin se enva cuando pulsamos cualquier botn. Por ejemplo el ID del boton01 es 1001 en decimal (3E9 en hex.), cuando nosotros pulsamos el boton01 el valor de wParam ser igual a 00003E9h donde: El cdigo de notificacin: 0000 igual BN_CLICKED. El ID del control: 03E9. mov eax,wParam mov edx,eax shr edx,16 .IF DX==BN_CLICKED .endif ; EAX = 00003E9h ; Movemos el contenido de EAX a EDX = 00003E9h ; EDX = 00000000 ; Compara si DX es igual a CERO

CAMPOS EDITABLES
La funcin GetDlgItemText recupera el ttulo o el texto asociado con un control en un cuadro de dilogo. UINT GetDlgItemText( HWND hDlg, // manejador al cuadro de dilogo int nIDDlgItem, // identificador del control LPCTSTR lpString, // direccin del buffer de texto int nMaxCount // mximo tamao de la cadena ); Parmetros: hDlg: Identifica al cuadro de dilogo que contienen el control. nIdDlgItem: Especifica el identificador del control del que se recuperar el ttulo o el texto. lpString: Puntero al buffer que recibir el ttulo o el texto. nMaxCount: Especifica la longitud mxima, en caracteres, de la cadena a copiar en le buffer apuntado por lpString. Si la longitud de la cadena excede el lmite, la cadena se truncar. Valor de retorno Si la funcin tiene xito, el valor de retorno indicar el nmero de caracteres copiados a buffer, sin incluir el carcter nulo de terminacin. Si la funcin falla, el valor de retorno es cero.

CAMPOS EDITABLES
La funcin SetDlgItemText cambia el ttulo o el texto de un control de un cuadro de dilogo. BOOL SetDlgItemText( HWND hwndDlg, // manipulador al cuadro de dilogo int idControl, // identificador del control LPCTSTR lpsz // texto a poner ); Parmetros: hwndDlg: idControl: lpsz:

Identifica al cuadro de dilogo que contienen el control. Especifica el identificador del control que recibe el mensaje. Puntero a cadena terminada en cero que contiene el texto a ser copiado al control.

Valor de retorno Si la funcin tiene xito, el valor de retorno es TRUE. Si la funcin falla, el valor de retorno es FALSE.

MENSAJES DE WINDOWS
El sistema operativo Windows, es un sistema conducido por "eventos", como las pulsaciones de tecla, movimientos y acciones con el Mouse, arrastre y dibujado de ventanas, entre muchos otros. Las aplicaciones Windows, pueden comunicarse entre si y pasarse informacin bsicamente por un sistema de mensajes, mantenido por el mismo Sistema Operativo. El sistema de mensajes de Windows, las aplicaciones, aunque no compartan la memoria, comparten el mismo sistema operativo. Los ltimos sistemas operativos son ms estables, donde se ve cuanto tiempo de procesador tiene cada proceso y poder detenerlo sin temor a que se cuelgue el sistema operativo. Todos los procesos mediante API's pueden ver la cola de mensajes de Windows y as tomar los suyos y continuar con su trabajo, de esta manera podemos comunicar dos o mas programas entre si. Windows mantiene una cola de mensajes para cada aplicacin. Cada aplicacin recoge sus mensajes y los procesa. Esto se basa en tres componentes principales: Cola de mensajes: administrada por Windows, para que cada aplicacin recoja sus mensajes en cuanto le toca su turno de procesador. Ciclo de mensajes: es un ciclo que tiene cada programa que se encarga de recoger estos mensajes. Procedimiento de ventana: Cada ventana tiene un procedimiento que procesa los mensajes que son pasados por el ciclo de mensajes.

FUNCION SENDMESSAGE
Por ejemplo si queremos enviar un icono a nuestra ventana especificamos el manejador de la ventana, el tipo de mensaje, el tamao del icono, y el manejador del icono. De esta manera declaramos la funcin SendMessage para enviar un icono a nuestro programa: SendMessage, hWin.- Manejador de la ventana. WM_SETICON.- Tipo de mensaje. ICON_BIG.- Tamao del Icono. h_icono.- manejador del icono. Si nosotros queremos cerrar nuestra ventana principal uno de tantos mtodos sera enviando el mensaje WM_CLOSE ejemplo: SendMessage.hWin.- Manejador de la ventana. WM_CLOSE.- Tipo de mensaje. 0.- No especificamos. 0.- No especificamos.

MENSAJES DE WINDOWS
Todos los mensajes de Windows, tienen un numero que los identifica, siempre definidos en Constantes, los nombres de constantes de mensajes Windows, comienzan con WM_ (Windows Message o Mensaje Windows. El proceso que se da para manipular un mensaje es el siguiente: a) Ocurre un evento en el sistema. b) Windows coloca la informacin del evento en una estructura de mensaje y lo coloca en la cola de mensajes. c) El ciclo de mensajes de la aplicacin recoge el mensaje. d) La cola de mensajes manda el evento al procedimiento de ventana adecuado. e) Se interpreta el mensaje en su aplicacin. Algunos mensajes:
WM_ACTIVATE WM_CLOSE WM_COMMAND WM_CREATE WM_LBUTTONDBLCLK WM_LBUTTONDOWN WM_MOUSEMOVE WM_MOVE WM_SIZE La ventana ha obtenido el foco. La ventana va a ser cerrada. Ha sido seleccionada una opcin del men. La ventana ha sido creada. Se ha hecho doble-click en el botn izquierdo Se ha hecho click en el botn izquierdo. El ratn se ha movido. La ventana se ha movido. Se ha cambiado el tamao de la ventana

MENSAJES SOPORTADOS POR ENSAMBLADOR (WINDOWS.INC)


WM_USER WM_NULL WM_CREATE WM_DESTROY WM_MOVE WM_SIZE WM_ACTIVATE WM_SETFOCUS WM_KILLFOCUS WM_ENABLE WM_SETREDRAW WM_SETTEXT WM_GETTEXT WM_GETTEXTLENGTH WM_PAINT WM_CLOSE WM_QUERYENDSESSION WM_QUIT
WM_QUERYOPEN WM_ERASEBKGND WM_SYSCOLORCHANGE WM_ENDSESSION WM_SHOWWINDOW WM_WININICHANGE WM_SETTINGCHANGE WM_WININICHANGE WM_DEVMODECHANGE WM_ACTIVATEAPP WM_FONTCHANGE WM_TIMECHANGE WM_CANCELMODE WM_SETCURSOR WM_MOUSEACTIVATE WM_CHILDACTIVATE WM_QUEUESYNC WM_GETMINMAXINFO WM_PAINTICON WM_ICONERASEBKGND WM_NEXTDLGCTL WM_SPOOLERSTATUS WM_DRAWITEM WM_MEASUREITEM WM_DELETEITEM WM_VKEYTOITEM WM_CHARTOITEM WM_SETFONT WM_GETFONT WM_SETHOTKEY WM_GETHOTKEY WM_QUERYDRAGICON WM_COMPAREITEM WM_GETOBJECT WM_COMPACTING WM_OTHERWINDOWCREATED WM_OTHERWINDOWDESTROYED WM_COMMNOTIFY

AGREGANDO UN ICONO
Si queremos enviar un icono a nuestra ventana especificamos el manejador de la ventana, el tipo de mensaje, el tamao del icono, y el manejador del icono. De esta manera declaramos la funcin SendMessage para enviar un icono a nuestro programa: SendMessage, hWin WM_SETICON ICON_BIG h_icono

Manejador de la ventana. Tipo de mensaje. Tamao del Icono. Manejador del icono.

Si nosotros queremos cerrar nuestra ventana principal uno de tantos mtodos seria enviamos el mensaje WM_CLOSE ejemplo: SendMessage.hWin WM_CLOSE 0 0

Manejador de la ventana. Tipo de mensaje. No utilizado. No utilizado.

You might also like