Cuadros de Dialogo en Windows
Ultima actualización: 5 January 2000 por
Dolphinz
SUMARIO
Este es mi primer tutorial en español, y espero que este bastante claro y facil de entender. En este tutorial voy a explicar como crear facilmente un cuadro de dialogo en windows.
El codigo fuente completo y compilado para este tutorial puedes bajarlo desde aqui : Cuadros de Dialogo
TEORIA
Generalmente un cuadro de dialogo toma la forma de una ventana
emergente que contiene varios controles de ventana hija.
El tamaño y la situacion de esos controles se especifica en el
script de recursos del programa (supongo que ya sabes lo que es eso).
Realmente los cuadros de dialogo son mucho más faciles que las ventanas normales. Recordemos que cada cuadro de dialogo tiene su propio procedimiento de dialogo (DLGPROC), al igual que cada ventana tiene su procedimiento de ventana
(WNDPROC).
En este articulo mostrare como manejar un cuadro de dialogo simple usando lenguaje ensamblador para windows.
Se pueden distinguir dos tipos de cuadros de dialogo:
modal o
no modal.
Una de las diferencias entre estos dos tipos de cuadros de dialogo, es que en el cuadro de dialogo
modal, el usuario tiene que contestar explicitamente al cuadro de dialogo, y no puede cambiar a otra
ventana.
CREAR EL CUADRO DE DIALOGO
Para crear el script de recursos del cuadro de dialogo, puede
usar alguna herramienta como un editor de recursos, o puede
hacerlo manualmente en un editor de textos, lo que resulta un
poco mas complicado, cuando el programador no es muy
experimentado.
Si se usa un editor de recursos, es bastante facil, ya que solo
se tiene que incluir los controles que se quiera (control de edicion, boton, control de lista, texto...) y asignarles
una identificación numerica. Este es el único numero que identificara el control en nuestro programa.
Ahora veamos un ejemplo de script de recursos para la plantilla de un cuadro de dialogo:
SampleDlg DIALOG 10, 10, 200, 60
STYLE DS_3DLOOK | DS_CENTER | WS_POPUP | WS_SYSMENU | WS_DLGFRAME
CAPTION "Ejemplo de Cuadro de Dialogo"
FONT 8, "Ms Sans Serif"
BEGIN
CTEXT "Ejemplo de un Cuadro de Dialogo", -1, 10,10,150,8
DEFPUSHBUTTON "Exit", IDCANCEL, 140,40,50,14
END |
Puedes observar que en la primera linea del script de recursos specificamos el nombre del cuadro de dialogo, que al igual que otros recursos aqui tambien se puede usar un numero para identificarlo en vez de un nombre.
A continuación, nos encontramos con la palabra clave
DIALOG, que indica que estas definiendo
un cuadro de dialogo y seguidamente 4 numeros que corresponden
con las esquinas de la ventana.
En la siguiente linea, se definen los estilos que van a definir las diferentes caractersiticas de nuestra ventana.
La palabra clave CAPTION, creo que se explica por si sola, indica el titulo que va a tener nuestro cuadro de dialogo, y FONT define el tamaño y tipo de fuente que se va a utilizar en el programa.
En este cuadro de dialogo, utilizo el control CTEXT (texto centrado), y
DEFPUSHBUTTON (boton por defecto), aunque existe una intrucción mucho más generalizada, que el compilador de recursos es capaz de reconocer y que sirve para
definir muchos controles.
CONTROL "texto", ID, "clase", iEstilo, xPos, yPos, xAncho, yAncho |
A continuación vamos a ver algunos ejemplos del uso de esta instrucción...
CONTROL "Aceptar", IDOK, "button", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 10,20,32,14
CONTROL "Texto 1", -1, "static", SS_RIGHT|WS_CHILD|WS_VISIBLE, 10,10,70,14
CONTROL "Edit 1", -1, "edit", ES_LEFT|WS_CHILD|WS_VISIBLE, 10,40,60,32
CONTROL "Lista 1", -1, "listbox", LBS_STANDARD|WS_CHILD|WS_VISIBLE, 10,80,80,50
|
Esta instrucción nos permite crear cualquier tipo de control specificando la clase de ventana y el estilo completo.
PROCEDIMIENTO DE CUADRO DE DIALOGO (DLGPROC)
El procedimiento del cuadro de dialogo es el encargado de gestionar todos los mensajes que lleguen al cuadro de dialogo. Aunque se parece mucho a un procedimiento de ventana, no es realmente un procedimiento de ventana.
Las principales diferencias entre un procedimiento de dialogo y un procedimiento de ventana son:
- El procedimiento de cuadro de dialogo, devuelve un valor de tipo BOOLEANO (verdadero o falso).
- El procedimiento de ventana, llama a la función DefWindowProcA( ) si no procesa ningún mensaje en particular, mientras que el procedimiento de cuadro de dialogo, devuelve
TRUE(1) si procesa un mensaje, y FALSE(0) si no procesa ningún mensaje.
- Un procedimiento de cuadro de dialogo no necesita procesar los mensajes WM_PAINT o WM_DESTROY, y tampoco recibirá un mensaje WM_CREATE, en vez de eso, el procedimiento de cuadro de dialogo, realiza la inicialización de sus controles, durante el mensaje especial WM_INITIDIALOG.
De manera que, se puede deducir que el mensaje WM_INITDIALOG, será el primer mensaje que recibira el procedimiento de cuadro de dialogo, ya que se trata de un mensaje que sólo se envia a
los procedimientos de cuadro de dialogo.
Tambien hay otro mensaje que procesa este cuadro de dialogo, se trata del mensaje WM_COMMAND. Este mensaje es enviado por el boton del cuadro de dialogo a su ventana padre, cuando se hace click con el raton, o se recibe la entrada desde el teclado.
Ahora vamos a observar un ejemplo de un procedimiento de cuadro de dialogo...
SampleDlgProc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
push ebx ; Guardamos los registros
push esi
push edi
cmp [wmsg], WM_INITDIALOG ; Es un mensaje WM_INITDIALOG ?
je dlginit
cmp [wmsg], WM_COMMAND ; Es un mensaje WM_COMMAND ?
je dlgcommand
cmp [wmsg], WM_CLOSE ; Es un mensaje WM_CLOSE ?
je dlgdestroy
xor eax, eax ; Devolver FALSE (0)
dlgfinish:
pop edi ; Restauramos los registros
pop esi
pop ebx
ret
dlginit:
xor eax, eax ; Aqui hacemos las inicializaciones
ret
dlgcommand:
cmp [wparam], IDOK ; Se ha pulsado IDOK ?
jne dlgnothing
dlgdestroy:
call EndDialog, [hwnd], 0 ; Cerrar el cuadro de dialogo
mov eax, 1 ; Devolver TRUE (1)
jmp dlgfinish
dlgnothing:
xor eax, eax ; Devolver FALSE (0)
jmp dlgfinish
SampleDlgProc endp
Public SampleDlgProc
|
LLAMAR AL CUADRO DE DIALOGO
Para poder llamar a un cuadro de dialogo, se puede hacer uso de una función que a mi me gusta mucho, se trata de DialogBoxParamA( ).
.DATA
DialogTemplate equ "SampleDlg" ; Igual que en el script de recursos
[...otro codigo aqui...]
.CODE
call DialogBoxParamA, hInstance, offset DialogTemplate, [Hwnd], offset SampleDlgProc
|
Para poder llamar a esta función se requieren varios parametros, como el handle del modulo (o handle de instancia), nombre del cuadro de dialogo tal y como esta definido en el script de recursos, el handle de la ventana padre (ventana principal del programa) si existe, y la direccion del procedimiento del cuadro de dialogo.
No es tan complicado usar este tipo de ventanas, aunqe se ahorra bastante espacio en cuanto al tamaño del ejecutable final.
Bueno, este ha sido mi tutorial sobre los Cuadros de Dialogo bajo windows, y por supuesto usando Turbo Ensamblador.
Feliz programación y hasta el proximo tutorial!!!...
|