Programación Windows API Con C++
Programación Windows API Con C++
net
Tabla de contenido
Tabla de contenido............................................................................................................ 2
Independencia de la máquina...................................................................................... 14
Recursos...................................................................................................................... 14
Ventanas...................................................................................................................... 15
Eventos........................................................................................................................ 15
Proyectos..................................................................................................................... 16
Convenciones.............................................................................................................. 16
Controles ..................................................................................................................... 17
Capítulo 1 Componentes de una ventana........................................................................ 18
El borde de la ventana................................................................................................. 18
Barra de título. ............................................................................................................ 18
Caja de minimizar. ...................................................................................................... 18
Caja de maximizar. ..................................................................................................... 18
Caja de cerrar. ............................................................................................................. 18
Caja de control de menú. ............................................................................................ 18
Menú. .......................................................................................................................... 18
Barra de menú. ............................................................................................................ 19
Barra de scroll horizontal............................................................................................ 19
Barra de scroll vertical. ............................................................................................... 19
El área de cliente......................................................................................................... 19
Capítulo 2 Notación Húngara ......................................................................................... 20
Ejemplos: .................................................................................................................... 20
Capítulo 3 La función "WinMain".................................................................................. 21
Parámetros de entrada de "WinMain"......................................................................... 21
Función WinMain típica ............................................................................................. 21
Declaración ................................................................................................................. 22
Inicialización............................................................................................................... 22
Bucle de mensajes....................................................................................................... 23
Capítulo 4 El procedimiento de ventana......................................................................... 25
Sintaxis........................................................................................................................ 25
Prototipo de procedimiento de ventana ...................................................................... 25
Implementación de procedimiento de ventana simple................................................ 25
Primer ejemplo de programa Windows ...................................................................... 26
Capítulo 5 Menús 1......................................................................................................... 27
Usando las funciones para inserción ítem a ítem:....................................................... 27
Uso básico de MessageBox: ....................................................................................... 29
Respondiendo a los mensajes del menú:..................................................................... 29
Ejemplo de programa Windows con menú................................................................. 30
Ficheros de recursos: .................................................................................................. 30
Cómo usar los recursos de menú: ............................................................................... 32
Capítulo 6 Diálogo básico............................................................................................... 34
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 funciones y los mensajes del
API son meras traducciones del fichero de ayuda de WIN32 de Microsoft, y sólo se
incluyen como complemento.
Independencia de la máquina
Los programas Windows son independientes de la máquina en la que se ejecutan (o
deberían serlo), el acceso a los dispositivos físicos se hace a través de interfaces, y
nunca se accede directamente a dispositivos físicos. Esta es una de las principales
ventajas para el programador, no hay que preocuparse por el modelo de tarjeta
gráfica o de impresora, la aplicación funcionará con todas, y será el sistema
operativo el que se encargue de que así sea.
Recursos
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 físicos, que son los dispositivos que componen el ordenador, como la
memoria, la impresora, el teclado o el ratón y recursos virtuales o lógicos, como
los gráficos, los iconos o las cadenas de caracteres.
Por ejemplo, si nuestra aplicación requiere el uso de un puerto serie, primero debe
averiguar si está disponible, es decir, si existe y si no lo está 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 o con la tarjeta de sonido, aunque son casos
diferentes. Por ejemplo, la 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, podrán o no compartirse
por varias aplicaciones. Otros recursos como el ratón y el teclado también se
comparten, pero se asigna su uso automáticamente a la aplicación activa, a la que
normalmente nos referiremos como la que tiene el "foco", es decir, la que mantiene
contacto con el usuario.
Ventanas
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
área 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 aplicación se canalizan a través de una ventana.
Cada ventana comparte el espacio de la pantalla con otras ventanas, incluso de
otras aplicaciones, aunque sólo una puede estar activa, es decir, sólo una puede
recibir información del usuario.
Eventos
Los programas en Windows están orientados a eventos, esto significa que
normalmente los programas están esperando a que se produzca un acontecimiento
que les incumba, y mientras tanto permanecen aletargados o dormidos.
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 deberías tener grandes dificultades para adaptarte a
cada uno.
Convenciones
En parte para que no te resulte muy difícil adaptarte a la terminología de Windows,
y a la documentación existente, y en parte para seguir mi propia costumbre, en la
mayoría 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 traduzca
sus nombre a castellano, por ejemplo, "dialog box" se nombrará a menudo como
"cuadro de diálogo".
Controles
Los controles son la forma en que las aplicaciones windows se comunican con el
usuario. Normalmente se usan dentro de los cuadros de diálogo, pero en realidad
pueden usarse en cualquier ventana.
Existen bastantes, y los iremos viendo poco a poco, al mismo tiempo que
aprendemos a manejarlos.
El borde de la ventana.
Hay varios tipos, dependiendo de que estén o no activas las opciones de cambiar el
tamaño de la ventana. Se trata de un área estrecha alrededor de la ventana que
permite cambiar su tamaño.
Barra de título.
Zona en la parte superior de la ventana que contiene el icono y el título de la
ventana, esta zona también se usa para mover la ventana a través de la pantalla.
Caja de minimizar.
Pequeña área cuadrada situada en la parte derecha de la barra de título que sirve
para disminuir el tamaño de la ventana. Antes de la aparición del Windows 95 la
ventana se convertía a su forma icónica, pero desde la aparición del Windows 95 se
elimina la ventana y sólo permanece el botón en la barra de estado.
Caja de maximizar.
Pequeña área cuadrada situada en la parte derecha de la barra de título que sirve
para agrandar la ventana para que ocupe toda la pantalla. Cuando la ventana está
maximizada, se sustituye por la caja de restaurar.
Caja de cerrar.
Pequeña área cuadrada situada en la parte derecha de la barra de título que sirve
para cerrar la ventana.
Menú.
Barra de menú.
Zona situada debajo de la barra de título, contiene los menús de la aplicación.
El área de cliente.
Es la zona donde el programador sitúa los controles, y los datos para el usuario. En
general es toda la superficie de la ventana lo que no está ocupada por las zonas
anteriores.
Prefijo Significado
b Booleano
c Carácter (un byte)
dw Entero largo de 32 bits sin signo (DOBLE WORD)
f Flags empaquetados en un entero de 16 bits
h Manipulador de 16 bits (HANDLE)
l Entero largo de 32 bits
lp Puntero a entero largo de 32 bits
lpfn Puntero largo a una función que devuelve un entero
lpsz Puntero largo a una cadena terminada con cero
n 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
sz Cadena terminada en cero
w Entero corto de 16 bits sin signo (WORD)
Ejemplos:
nContador: la variable es un entero que se usará como contador.
RegisterClass(&WndClass);
hWnd = CreateWindow(
"NUESTRA_CLASE",
"Ventana de Ejemplo",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
320,
200,
HWND_DESKTOP,
NULL,
hInstance,
NULL
);
ShowWindow(hWnd, SW_SHOWDEFAULT);
while(TRUE == GetMessage(&Message, 0, 0, 0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
Declaración
En la primera zona declararemos las variables que necesitamos para nuestra
función WinMain, que como mínimo serán tres:
Inicialización
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 parámetro nCmdShow de WinMain
como parámetro o mejor aún, 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.
while(GetMessage(&Message, 0, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
Normalmente, estas funciones están basadas en una estructura "switch" donde cada
"case" corresponde aun determinado tipo de mensaje.
Sintaxis
LRESULT CALLBACK WindowProcedure(
HWND hwnd, // Manipulador de ventana
UINT msg, // Mensaje
WPARAM wParam, // Parámetro palabra, varía
LPARAM lParam // Parámetro doble palabra, varía
);
Implementación 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 lParam)
{
switch (msg) /* manipulador del mensaje */
{
case WM_DESTROY:
Este mensaje sólo sirve para informar a la aplicación de que el usuario tiene la
intención de abandonar la aplicación, y le da una oportunidad de dejar las cosas en
su sitio: cerrar ficheros, liberar memoria, guardar variables, etc. Incluso, la
aplicación puede decidir que aún 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.
Este es el camino que sigue el mensaje WM_QUIT cuando llega, ya que el proceso
por defecto para este mensaje es cerrar la aplicación.
Supongo que todos sabemos lo que es un menú: 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 elegir.
Cuando se usan en una aplicación, normalmente se agrupan varios menús bajo una
barra horizontal, (que no es otra cosa que un menú), dividida en varias zonas o
ítems.
Cada ítem de un menú que tenga asociado un comando o un valor, es decir todos
menos los separadores y aquellos que despliegan nuevos menús, tiene asociado un
identificador. Este valor se usa por la aplicación para saber qué opción se activó
por el usuario, y decidir las acciones a tomar en consecuencia.
Existen varias formas de añadir un menú a una ventana, veremos cada una de ellas
por separado.
void InsertarMenu(HWND);
Y por último, sólo nos queda llamar a nuestra función, insertaremos ésta llamada
justo antes de visualizar la ventana.
...
InsertarMenu(hWnd);
ShowWindow(hWnd, SW_SHOWDEFAULT);
...
La primera novedad son las variables del tipo HMENU. HMENU es un tipo de
manipulador especial para menús. Necesitamos dos variables de este tipo, una para
manipular la barra de menú, hMenu1. La otra para manipular cada uno de los
menús pop-up, en este caso sólo uno, hMenu2.
De momento haremos una barra de menú con un único elemento que será un menú
pop-up. Después veremos como implementar menús más complejos.
Para crear un menú usaremos la función CreateMenu, que crea un menú vacío.
El segundo son las opciones o atributos del nuevo ítem, por ejemplo MF_STRING,
indica que se trata de un ítem de tipo texto, MF_SEPARATOR, es un ítem
separador y MF_POPUP, indica que se trata de un menú que desplegará un nuevo
menú pop-up.
Prueba estas funciones y juega un rato con ellas. En la sigiente página veremos
cómo hacer que nuestra aplicación responda a los mensajes del menú.
Antes de complicar más nuestros menús, veamos cómo hacer que nuestra
aplicación se de cuenta de que el usuario ha activado una opción del menú. Y para
que nos lo notifique a nosotros usaremos un cuadro de mensaje.
Para procesar estos mensajes, cuando sólo podemos recibir mensajes desde un
menú, únicamente nos interesa la palabra de menor peso del parámetro wParam del
mensaje.
Sencillo, ¿no?.
Observa que hemos usado la macro LOWORD para extraer el identificador del
ítem del parámetro wParam. Después de eso, todo es más fácil.
También se puede ver que hemos usado la misma función para salir de la
aplicación que para el mensaje WM_DESTROY: PostQuitMessage.
Veamos ahora una forma más sencilla y más habitual de implementar menús.
Ficheros de recursos:
Para ello creamos un nuevo proyecto de tipo GUI, al que llamaremos Win3, y
copiamos el contenido de "ejemplo1.c" en el fichero "untitled1", al que
renombraremos como "ejemplo3.c".
Pinchando sobre el ítem del nuevo fichero éste se abrirá. Introducimos los
identificadores:
#include "ids.h"
Ahora editaremos el fichero de recursos. Para ello pulsamos con el botón derecho
del ratón sobre el ítem del proyecto y elegímos el ítem de menú "edit resource
file".
Menu MENU
BEGIN
POPUP "&Principal"
BEGIN
MENUITEM "&Prueba", ID_PRUEBA
MENUITEM SEPARATOR
MENUITEM "&Salir", ID_SALIR
END
END
Para ver más detalles sobre el uso de este recurso puedes consultar las claves:
MENU, POPUP y MENUITEM.
Primero veremos cómo cargarlo y asignarlo a nuestra ventana, ésta es la forma que
más se parece a la del ejemplo del capítulo anterior. Para ello basta con insertar
éste código antes de llamar a la función ShowWindow:
HMENU hMenu;
...
hMenu = LoadMenu(hInstance, "Menu");
SetMenu (hWnd, hMenu);
O simplemente:
La función LoadMenu se encarga de cargar el recurso de menú, para ello hay que
proporcionarle un manipulador de la instancia a la que pertenece el recurso y el
nombre del menú..
Otro sistema, más sencillo todavía, es asignarlo como menú por defecto de la clase.
Para esto basta con la siguiente asignación:
WndClass.lpszMenuName = "Menu";
hWnd = CreateWindow(
"NUESTRA_CLASE",
"Ventana de Ejemplo",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
320,
200,
HWND_DESKTOP,
LoadMenu(hInstance, "Menu"), // Carga y asignación de menú
hInstance,
NULL
);
Ejemplo 3:
Igual que los menús, los cuadros de diálogo se pueden construir durante la
ejecución o a partir de un fichero de recursos.
Ficheros de recursos:
La mayoría de los compiladores de C/C++ que incluyen soporte para Windows
poseen herramientas para la edición de recursos: menús, diálogos, bitmaps, etc. Sin
embargo considero que es interesante que aprendamos a construir nuestros recursos
con un editor de textos, cada compilador tiene sus propios editores de recursos, y
no tendría 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 diálogo igual que hemos aprendido
a hacer menús, usando sólo texto.
Para el primer programa de ejemplo de programa con diálogos, que será el ejemplo
4, partiremos de nuevo del programa del ejemplo 1. Nuestro primer diálogo será
muy sencillo: un simple cuadro con un texto y un botón de "Aceptar".
#include <windows.h>
#include "IDS.H"
Menu MENU
BEGIN
POPUP "&Principal"
BEGUIN
MENUITEM "&Diálogo", CM_DIALOGO
END
END
/* Identificadores */
/* Identificadores de comandos */
#define CM_DIALOGO 101
De momento bastará con un identificador, como el que usabamos para los menús; y
además las coordenadas y dimensiones del diálogo.
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
"estilos de ventana". Y los estilos de diálogos, que comienzan con "DS_", en
"estilos de dialogo".
Después está la zona de controles, en nuestro ejemplo sólo hemos incluido un texto
estático y un botón.
Un control estático (static) nos sirve para mostrar textos o rectángulos, que
podemos usar para informar al usuario de algo, como etiquetas o como adorno.
Para más detalles ver controles static.
• 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 mostrará.
• id es el identificador del control. Como los controles static no se suelen
manejar por las aplicaciones no necesitamos un identificador, así 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 rectángulo y el texto suministrado se
alinea en su interior a la izquierda.
oWS_CHILD: crea el control como una ventana hija.
oWS_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 comunicarnos con el diálogo, podemos darle
comandos del mismo tipo que los que proporciona un menú. Para más detalles ver
controles button.
• 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 mostrará en
su interior.
• id es el identificador del control. Nuestra aplicación recibirá este identificador
junto con el mensaje WM_COMMAND cuando el usuario active el botón.
La etiqueta IDOK está 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:
Procedimiento de diálogo:
Como ya hemos dicho, un diálogo es básicamente una ventana, y al igual que
aquella, necesita un procedimiento asociado que procese los mensajes quele sean
enviados, en este caso, un procedimiento de diálogo.
Sintaxis
BOOL CALLBACK DialogProc(
HWND hwndDlg, // manipulador del cuadro de diálogo
UINT uMsg, // mensaje
WPARAM wParam, // primer parámetro del mensaje
LPARAM lParam // segundo parámetro del mensaje
);
Implementación de procedimiento de
diálogo para nuestro ejemplo
Nuestro ejemplo es muy sencillo, ya que nuestro diálogo sólo puede proporcionar
un comando, así que sólo debemos responder a un tipo de mensaje
WM_COMMAND y al mensaje WM_INITDIALOG.
Este mensaje lo usaremos para inicializar nuestro diálogo antes de que sea visible
para el usuario, cuando haya algo que inicializar, claro.
Bueno, sólo nos falta saber como creamos un cuadro de diálogo. Para ello
usaremos un comando de menú, por lo tanto, el diálogo se activará desde el
procedimiento de ventana.
Primero hemos declarado una variable estática "hInstance" para tener siempre a
mano un manipulador de la instancia actual.
Para inicializar este valor hacemos uso del mensaje WM_CREATE, que se envía a
una ventana cuando es creada, 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 ningún comando. En el
futuro veremos que se usa para toda clase de inicializaciones.
Ejemplo 4: 16/01/2001
En el capítulo anterior hemos usado dos controles (un texto estático y un botón),
aunque sin saber exactamente cómo funcionan. En éste capítulo veremos el uso del
control de edición.
Fichero de recursos
Empezaremos definiendo el control edit en el fichero de recursos, y lo añadiremos
a nuestro dialogo de prueba.
Hemos añadido el control edit a continuación del control static. Veremos que el
orden en que aparecen los controles dentro del cuadro de diálogo es muy
• 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 mostrará 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 ventana:
oES_LEFT: indica que el texto en el interior del control se alineará a la
izquierda.
oWS_CHILD: crea el control como una ventana hija.
oWS_VISIBLE: crea una ventana inicialmente visible.
oWS_BORDER: se crea un control que tiene de borde una línea fina.
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.
case WM_COMMAND:
if(LOWORD(wParam) == IDOK) EndDialog(hDlg, FALSE);
return TRUE;
case WM_INITDIALOG:
SetFocus(GetDlgItem(hDlg, ID_TEXTO));
return FALSE;
De nuevo es una modificación sencilla, tan sólo haremos que el foco del teclado se
coloque en el control edit, de modo que el ususario pueda empezar a escribir
directamente.
Para hacer eso usaremos la función SetFocus. Pero esta función requiere como
parámetro el manipulador de ventana del control que debe recibir el foco, este
manipulador lo conseguimos con la función GetDlgItem, que a su vez necesita
como parámetros un manipulador del diálogo y el identificador del control.
Se trata de crear una estructura con todos los datos que queremos que el
procedimiento de diálogo comparta con el procedimiento de ventana:
DATOS Datos;
Lo más sencillo es que estos datos sean globales, pero no será buena idea cuando
nuestros programas estén escritos en C++, ya que en POO no está "bien visto" el
uso de variables globales.
case WM_INITDIALOG:
SendDlgItemMessage(hDlg, ID_TEXTO, EM_LIMITTEXT, 80, 0L);
SetDlgItemText(hDlg, ID_TEXTO, Datos.Texto);
SetFocus(GetDlgItem(hDlg, ID_TEXTO));
return FALSE;
Hemos añadido dos llamamadas a dos nuevas funciones del API. La primera es a
SendDlgItemMessage, que envía un mensaje a un control. En este caso se trata de
un mensaje EM_LIMITTEXT, que sirve para limitar la longitud del texto que se
puede almacenar y editar en el control. En secesario que hagamos esto, ya que el
texto que puede almacenar nuestra estructura de datos está limitado a 80 caracteres.
Pero ahora nos limitaremos a leer ese contenido cuando procesemos el comando
generado al pulsar el botón de "Aceptar".
case WM_COMMAND:
if(LOWORD(wParam) == IDOK)
{
Ahora puedes comprobar lo que pasa cuando abres varias veces seguidas el cuadro
de diálogo modificando el texto cada vez.
Con esto parece que ya comtrolamos lo básico de los controles edit, pero aún hay
algo más.
Como puedes ver, sólo leemos el contenido del control edit si se ha pulsado el
botón de "Aceptar".
Ejemplo 5: 4/02/2001
Para eso, el API tiene previstas algunas constantes y funciones, (no así para
números en coma flotante, para los que tendremos que crear nuestros propios
controles).
Bien, vamos a modificar nuestro ejemplo para editar valores numéricos en lugar de
cadenas de texto.
DATOS Datos;
case WM_INITDIALOG:
SetDlgItemInt(hDlg, ID_NUMERO, (UINT)Datos.Numero, FALSE);
SetFocus(GetDlgItem(hDlg, ID_NUMERO));
return FALSE;
BOOL NumeroOk;
...
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
Datos.Numero = GetDlgItemInt(hDlg, ID_NUMERO, &NumeroOk,
FALSE);
if(NumeroOk) EndDialog(hDlg, FALSE);
else MessageBox(hDlg, "Número no válido", "Error",
MB_ICONEXCLAMATION | MB_OK);
break;
Ejemplo 6: 10/02/2001
El usuario puede seleccionar una cadena apuntandola y haciendo clic con el botón
del ratón. Cuando una cadena se selecciona, se resalta y se envía un mensaje de
notificación a la ventana padre. También se puede usar una barra de scroll con los
listbox para desplazar listas muy largas o demasiado anchas para la ventana.
Ficheros de recursos
Empezaremos definiendo el control listbox en el fichero de recursos, y lo
añadiremos a nuestro dialogo de prueba:
Hemos añadido el control listbox a continuación del control static. Para más
detalles acerca de los controles listbox ver controles listbox.
// Datos de la aplicación
typedef struct stDatos {
char Item[80];
} DATOS;
DATOS Datos;
case WM_INITDIALOG:
// Añadir cadenas. Mensaje: LB_ADDSTRING
También podemos preseleccionar alguna de las cadenas del listbox, aunque esto no
es muy frecuente ya que se suele dejar al usuario que seleccione una opción sin
sugerirle nada. Para seleccionar una de las cadenas también se usa un mensaje:
LB_SELECTSTRING. Usaremos el valor -1 en wParam para indicar que se
busque en todo el listbox.
Cuando trabajemos con memoria dínamica y con ítems de longitud variable, será
interesante saber la longitud de la cadena antes de leerta desde el listbox. Para eso
podemos usar el mensaje LB_GETTEXTLEN.
UINT indice;
...
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
indice = SendDlgItemMessage(hDlg, ID_LISTA, LB_GETCURSEL, 0,
0);
Ejemplo 7: 10/02/2001
Los botones se unan para que el usuario pueda ejecutar ciertas acciones o para dar
órdenes a una aplicación. En muchos aspectos, funcionan igual que los menús, y de
hecho, ambos generan mensajes de tipo WM_COMMAND.
En realidad ya hemos usado controles button en todos los ejemplos anteriores, pero
los explicaremos ahora con algo más de detalle.
Ficheros de recursos
Empezaremos definiendo el control button en el fichero de recursos, y lo
añadiremos a nuestro dialogo de prueba:
Hemos añadido un nuevo control button a continuación del control static. Para más
detalles acerca de los controles button ver controles button.
Ahora veamos cómo hemos definido nuestro control button, y tambíen los otros
dos que hemos usado hasta ahora.:
case WM_INITDIALOG:
SetFocus(GetDlgItem(hDlg, ID_BOTON));
case WM_COMMAND:
switch(LOWORD(wParam)) {
case ID_BOTON:
MessageBox(hDlg, "Se pulsó 'Nuestro botón'", "Acción",
MB_ICONINFORMATION|MB_OK);
break;
case IDOK:
EndDialog(hDlg, FALSE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
return TRUE;
Ejemplo 8: 19/02/2001
Existen varios tipos de controles static, o mejor dicho, varios estilos de controles
static.
Dependiendo del estilo que elijamos para cada control static, su aspecto será
radicalmente distinto, desde una simple línea o cuadro hasta un bitmap, un icono o
un texto.
En realidad ya hemos usado controles static del tipo etiqueta cuando vimos los
controles edit, lisbox y button, pero de nuevo los explicaremos ahora con más
detalle.
Ficheros de recursos
Empezaremos definiendo varios controles static en el fichero de recursos, y los
añadiremos a nuestro dialogo de prueba, para obtener un muestrario:
Hemos añadido diez nuevos controles static. Para más detalles acerca de los
controles static ver controles static.
En el ejemplo, verifica lo que sucede al pulsar la tecla ALT más '1' ó '2'. Verás que
el foco del teclado se desplaza a los cuadros de edición 1 y 2.
Ejemplo 9: 18/03/2001
Ficheros de recursos
Para nuestro ejemplo incluiremos un control ComboBox de cada tipo, así veremos
las peculiaridades de cada uno:
Hemos añadido los nuevos controles ComboBox. Para más detalles acerca de estos
controles ver controles combobox.
Ahora veremos más detalles sobre los estilos de los controles ComboBox:
Para hacer más fácil la inicialización de las listas, usaremos los mismos valores en
las tres. Para ello definiremos un array de cadenas con los valores que usaremos:
char *Lista[] = {
"aaaaaaaaaaaa",
"bbbbbbbbbbbb",
"cccccccccccc",
"rrrrrrrrrrrr",
"ffffffffffff",
"dddddddddddd"
};
/* Datos de la aplicación */
typedef struct stDatos {
char Item[3][80];
} DATOS;
DATOS Datos;
strcpy(Datos.Item[0], "a");
strcpy(Datos.Item[1], "c");
strcpy(Datos.Item[2], "r");
case WM_INITDIALOG:
// Añadir cadenas. Mensaje: LB_ADDSTRING
for(i = 0; i < 6; i++) {
SendDlgItemMessage(hDlg, ID_COMBOBOX1, CB_ADDSTRING, 0,
(LPARAM)Lista[i]);
SendDlgItemMessage(hDlg, ID_COMBOBOX2, CB_ADDSTRING, 0,
(LPARAM)Lista[i]);
SendDlgItemMessage(hDlg, ID_COMBOBOX3, CB_ADDSTRING, 0,
(LPARAM)Lista[i]);
}
Cuando trabajemos con memoria dínamica y con ítems de longitud variable, será
interesante saber la longitud de la cadena antes de leerta desde el listbox. Para eso
podemos usar el mensaje CB_GETLBTEXTLEN.
Para capturar el contenido del control Edit asociado a un ComboBox se puede usar
la función GetDlgItemText. Y también el mensaje WM_GETTEXT y
WM_GETTEXTLENGTH.
Como tenemos tres tipos de ComboBox, usaremos un método diferente con cada
uno de ellos. Veamos cómo podría quedar el tratamiento del mensaje
WM_COMMAND:
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
// En el ComboList Simple usaremos:
GetDlgItemText(hDlg, ID_COMBOBOX1, Datos.Item[0], 80);
// En el ComboList DropDown usaremos:
Para evitar eso deberíamos añadir cada nuevo valor introducido a la lista. Nuestro
ejemplo es un poco limitado, ya que no tiene previsto que la lista pueda crecer, y
desde luego, no guardará los valores de la lista cuando el programa termine, de
modo que estén disponibles en sucesivas ejecuciones. Pero de momento nos
conformaremos con ciertas modificaciones mínimas que ilustren cómo solventar
este error.
int nCadenas;
char Lista[MAX_CADENAS][80] = {
"aaaaaaaaaaaa",
"bbbbbbbbbbbb",
"cccccccccccc",
"rrrrrrrrrrrr",
"ffffffffffff",
"dddddddddddd"
};
nCadenas = 6;
Y para leer los valores introducidos, y añadirlos a la lista si no están. Para eso
usaremos el mensaje CB_FINDSTRINGEXACT, que buscará una cadena entre los
valores almacenados en la lista, si se encuentra devolverá un índice, y si no, el
valor CB_ERR.
case IDOK:
// En el ComboList Simple usaremos:
GetDlgItemText(hDlg, ID_COMBOBOX1, Datos.Item[0], 80);
if(SendDlgItemMessage(hDlg, ID_COMBOBOX1,
CB_FINDSTRINGEXACT,
(WPARAM)-1, (LPARAM)Datos.Item[0]) == CB_ERR)
strcpy(Lista[nCadenas++], Datos.Item[0]);
// En el ComboList DropDown usaremos:
SendDlgItemMessage(hDlg, ID_COMBOBOX2, WM_GETTEXT, 80,
(LPARAM)Datos.Item[1]);
if(SendDlgItemMessage(hDlg, ID_COMBOBOX1,
CB_FINDSTRINGEXACT,
(WPARAM)-1, (LPARAM)Datos.Item[1]) == CB_ERR &&
strcmp(Datos.Item[0], Datos.Item[1]))
strcpy(Lista[nCadenas++], Datos.Item[1]);
// En el ComboList DropDownList usaremos:
indice = SendDlgItemMessage(hDlg, ID_COMBOBOX3,
CB_GETCURSEL, 0, 0);
SendDlgItemMessage(hDlg, ID_COMBOBOX3, CB_GETLBTEXT,
indice, (LPARAM)Datos.Item[2]);
wsprintf(resultado, "%s\n%s\n%s", Datos.Item[0], Datos.Item[1],
Datos.Item[2]);
MessageBox(hDlg, resultado, "Leido", MB_OK);
EndDialog(hDlg, FALSE);
return TRUE;
Las ventanas pueden mostrar contenidos que ocupan más espacio del que cabe en
su interior, cuando eso sucede se suelen agregar unos controles en forma de barra
que permiten desplazar el contenido a traves del área de la ventana de modo que el
usuario pueda ver las partes ocultas del documento.
Pero las barras de scroll pueden usarse para introducir otros tipos de datos en
nuestras aplicaciones, en general, cualquier magnitud de la que sepamos el máximo
y el mínimo, y que tenga un rango valores finito. Por ejemplo un control de
volumen, de 0 a 10, o un termostato de -15º a 60º.
Las barras de desplazamiento tienen varias partes o zonas diferenciadas, cada una
con su función particular. Me imagino que ya las conoces, pero las veremos desde
el punto de vista de un programador.
Para ver cómo funcionan las barras de scroll hemos añadido dos controles Edit, que
mostrarán los valores seleccionados en cada control ScrollBar. Para más detalles
acerca de estos controles ver controles scrollbar.
Ahora veremos más detalles sobre los estilos de los controles ScrollBar:
// Datos de la aplicación
typedef struct stDatos {
int ValorH;
int ValorV;
} DATOS;
DATOS Datos;
Datos.ValorH = 10;
Datos.ValorV = 32;
case WM_INITDIALOG:
SetScrollRange(GetDlgItem(hDlg, ID_SCROLLH), SB_CTL, 0, 100, true);
SCROLLINFO sih = {
sizeof(SCROLLINFO),
SIF_POS | SIF_RANGE | SIF_PAGE,
0, 104,
5,
Datos.ValorH,
0};
SCROLLINFO siv = {
sizeof(SCROLLINFO),
SIF_POS | SIF_RANGE | SIF_PAGE,
0, 54,
5,
Datos.ValorV,
0};
...
case WM_INITDIALOG:
SetScrollInfo(GetDlgItem(hDlg, ID_SCROLLH), SB_CTL, &sih, true);
SetDlgItemInt(hDlg, ID_EDITH, (UINT)Datos.ValorH, FALSE);
SendDlgItemMessage(hDlg, ID_SCROLLV, SBM_SETSCROLLINFO,
(WPARAM)TRUE, (LPARAM)&siv);
SetDlgItemInt(hDlg, ID_EDITV, (UINT)Datos.ValorV, FALSE);
return FALSE;
Hay que tener en cuenta que el valor máximo que podremos establecer en un
control no es siempre el que nosotros indicamos en el miembro nMax de la
estructura SCROLLINFO. Este valor depende del valor de la página (nPage), y
será nMax-nPage+1. Así que si queremos que nuestro control pueda devolver 100,
y la página tiene un valor de 5, debemos definir nMax como 104. Este
funcionamiento está diseñado para scrollbars como los que incluyen las ventanas,
donde la caja indica la porción del documento que se muestra en su interior.
De modo que nuestra rutina para manejar los mensajes de los scrollbars debe ser
capaz de distinguir el control del que procede el mensaje y el tipo de acción, para
actuar en consecuencia.
switch(Codigo) {
case SB_BOTTOM:
Pos = 0;
break;
case SB_TOP:
Pos = 100;
break;
case SB_LINERIGHT:
Pos++;
break;
case SB_LINELEFT:
Pos--;
break;
case SB_PAGERIGHT:
Pos += 5;
break;
case SB_PAGELEFT:
Pos -= 5;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
Hemos usado una función nueva, GetScrollPos para leer la posición actual del
thumb.
switch(Codigo) {
case SB_BOTTOM:
si.nPos = si.nMin;
break;
case SB_TOP:
si.nPos = si.nMax;
break;
case SB_LINERIGHT:
si.nPos++;
También en este caso podemos usar un mensaje o una función para leer la posición
del thumb del scrollbar. La función ya la hemos visto un poco más arriba, se trata
de GetScrollPos. El mensaje es SBM_GETPOS, ambos devuelven el valor de la
posición actual del thumb del control.
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
Datos.ValorH = GetScrollPos(GetDlgItem(hDlg, ID_SCROLLH),
SB_CTL);
Datos.ValorV = SendDlgItemMessage(hDlg, ID_SCROLLV,
SBM_GETPOS, 0, 0);
EndDialog(hDlg, FALSE);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, FALSE);
return FALSE;
Estilo Significado
Crea un button que es lo mismo que un check box,
salvo que puede ponerse gris (grayed) además de ser
BS_3STATE marcado (checked) o desmarcado (unchecked). El
estado gris se usa para mostrar que el check box está
indeterminado.
Crea un button que es igual que el check box de tres
estados, salvo que cambia de estado cuando el
BS_AUTO3STATE
usuario lo selecciona. El estado cambia
alternativamente entre checked, grayed y unchecked.
Crea un button que es igual que un check box, pero
que cuyo estado de selección oscila automáticamente
BS_AUTOCHECKBOX
entre checked y unchecked cada vez que el usuario
selecciona el check box.
Crea un button que es igual que un radio button, pero
que cuando es seleccionado por el usuario, Windows
BS_AUTORADIOBUTTON cambia su estado automáticamente a seleccionado y
automaticamente deselecciona el resto de los radio
buttons del mismo grupo.
Crea un pequeño check box vacío con texto. Por
defecto, el texto se muestra a la derecha del check
box. Para mostrar el texto a la izquierda, hay que
BS_CHECKBOX
combinar este flag con el estilo BS_LEFTTEXT (o
sólo para Windows 95, con su equivalente
BS_RIGHTBUTTON).
Crea un botón normal que se comporta como uno del
estilo BS_PUSHBUTTON, pero también tiene un
borde negro y grueso. Si el botón está en un cuadro
de diálogo, el usuario puede pulsar este botón usando
BS_DEFPUSHBUTTON
la tecla ENTER, aún cuando el botón no tenga el
foco de entrada. Este estilo es corriente para permitir
al usuario seleccionar rápidamente la opción más
frecuente, la opción por defecto.
Crea un rectángulo en cuyo interior se pueden
agrupar otros contoles. Cualquier texto asociado con
BS_GROUPBOX
este estilo se mostrará en la esquina superior
izquierda del rectángulo.
Coloca un texto a la izquierda de un radio button o
BS_LEFTTEXT check box cuando se combina con los estilos radio
button o check box. Lo mismo que el estilo de
Estilo Significado
Desplaza automáticamente a
la derecha el texto en un
control edit cuando el usuario
escribe al final de la línea. Si
CBS_AUTOHSCROLL
este estilo no se selecciona,
sólo puede introducirse el
texto que cabe en los límites
del cuadro de edición.
Muestra la barra de scroll
vertical deshabilitada en el
list box cuando no contiene
suficientes elementos para
CBS_DISABLENOSCROLL
desplazarlos. Sin este estilo
la barra de scroll se oculta si
no hay suficientes elementos
en la lista.
Igual que CBS_SIMPLE,
salvo que no se muestra el
CBS_DROPDOWN list box si el usuario no
selecciona el icono cercano
al control edit.
Igual que
CBS_DROPDOWN, salvo
que el control edit se
CBS_DROPDOWNLIST
sustituye por un static text
que muestra la selección
actual del list box.
Especifica que un combo box
owner-drawn (actualizado
por la ventana padre)
contiene elementos que son
cadenas. El combo box
mantiene la memoria y las
CBS_HASSTRINGS
direcciones de las cadenas,
así que la aplicación puede
usar el mensaje
CB_GETLBTEXT para
recuperar el texto de un
elemento en particular.
Estilo Significado
Sólo para Windows 95: proporciona al
dialog box una fuente no enfatizada y
dibuja bordes tridimensionales
alrededor de las ventanas de control en
el cuadro de diálogo.
Estilo Significado
Desplaza automáticamente 10 caracteres a
la derecha el texto cuando el usuario
introduce caracteres al final de la línea.
ES_AUTOHSCROLL
cuando el usuario presiona la tecla de
ENTER, el control desplaza el texto de
nuevo a la posición cero.
Desplaza automáticamente el texto una
ES_AUTOVSCROLL página arriba cuando el usuario presiona
la tecla de ENTER en la última línea.
Centra el texto en un control edit
ES_CENTER
multilínea.
ES_LEFT Alinea el texto a la izquierda.
Convierte todos los caracteres
ES_LOWERCASE
introducidos en el edit a minúsculas.
Indica que se trata de un control edit
multilínea. Por defecto los controles edit
son de una sola línea.
Si se especifica el estilo
Estilo Significado
Muestra una barra de scroll
vertical deshabilitada para el
list box cuando no contiene
suficientes elementos como
LBS_DISABLENOSCROLL para desplazarlos. Si no se
especifica éste estilo, la barra
de scroll se oculta cuando el
list box no contiene suficientes
elementos.
Permite que varios elementos
puedan ser seleccionados
LBS_EXTENDEDSEL usando la tecla SHIFT y el
ratón o combinaciones
especiales de teclas.
Indica que el list box contiene
elementos que son cadenas. El
list box mantiene la memoria y
las direcciones de las cadenas,
así que la aplicación puede usar
el mensaje LB_GETTEXT
LBS_HASSTRINGS para recuperar el texto de un
elemento en particular. Por
defecto, todas los list boxes,
menos los owner-drawn, tienen
este estilo. Se puede crear un
list box de tipo owner-drawn
tanto con o sin este estilo.
Indica un list box
multicolumna que es
desplazado horizontalmente. El
LBS_MULTICOLUMN mensaje
LB_SETCOLUMNWIDTH
ajusta en ancho de las
columnas.
Cambia la selección de cada
cadena, cada vez que el usuario
hace click o doble click sobre
LBS_MULTIPLESEL
una cadena del list box. El
usuario puede seleccionar
cualquier número de
Valor Significado
Oculta la ventana y activa una
SW_HIDE
distinta.
SW_MAXIMIZE Maximiza la ventana especificada.
Minimiza la ventana especificada
SW_MINIMIZE y activa la siguiente de mayor
nivel en la lista Z de ventanas.
Activa y muestra la ventana. Si la
ventana está minimizada o
maximizada, se restaurará a su
SW_RESTORE tamaño y posición original. Una
aplicación debe especificar estea
opción cuando restaure una
ventana minimizada.
Activa la ventana y la muestra en
SW_SHOW
su tamaño y posición actuales.
Ajusta el modo de mostrar la
ventana basado en los flags SW_
especificados en la estructura
STARTUPINFO pasada la la
función CreateProcess por el
SW_SHOWDEFAULT
programa que lanza la aplicación.
Una aplicación debe llamar a
ShowWindow con este flag para
ajustar en estado inicial de su
ventana principal.
Activa la ventana y la muestra
SW_SHOWMAXIMIZED
como una ventana maximizada.
Activa la ventana y la muestra
SW_SHOWMINIMIZED
como una ventana minimizada.
Muestra como una ventana
SW_SHOWMINNOACTIVE minimizada. La ventana activa
permanece activa.
Muestra la ventana en su estado
SW_SHOWNA actual. La ventana activa
permanece activa.
Muestra la ventana en su estado
más reciente de tamaño y posición.
SW_SHOWNOACTIVATE
La ventana activa permanece
activa.
Estilo Significado
Alinea el borde inferior del scroll bar con
el borde inferior del rectángulo definido
por los parámetros x, y, nWidth y
SBS_BOTTOMALIGN nHeight de la función CreateWindow. El
scroll bar tiene la altura por defecto para
los scroll bars del sistema. Usar este estilo
junto con el estilo SBS_HORZ.
Especifica un scroll bar horizontal. Si no
se especicican los estilos
SBS_BOTTOMALIGN o
SBS_HORZ SBS_TOPALIGN, el scroll bar tendrá la
altuna, anchura y posición especificados
pos los parámetros de la función
CreateWindow.
Alinea el borde izquierdo del scroll bar
con el borde izquierdo del rectángulo
definido por los parámetros de la función
SBS_LEFTALIGN CreateWindow. El scroll bar tiene la
anchura por defecto para los scroll bars
del sistema. Usar este estilo junto con el
estilo SBS_VERT.
Alinea el borde derecho del scroll bar con
el borde derecho del rectángulo definido
por los parámetros de la función
SBS_RIGHTALIGN CreateWindow. El scroll bar tiene la
anchura por defecto para los scroll bars
del sistema. Usar este estilo junto con el
estilo SBS_VERT.
Especifica una caja de tamaño (size box).
Si no se especifican ninguno de los estilos
SBS_SIZEBOXBOTTOMRIGHTALIGN
SBS_SIZEBOX o SBS_SIZEBOXTOPLEFTALIGN, el
size box tendrá la altura, anchura y
posición especificados por los parámetros
de CreateWindow.
Alinea la esquina inferior derecha del size
box con la esquina inferior derecha del
SBS_SIZEBOXBOTTOMRIGHTALIGN rectángulo definido por los parámetros de
la función CreateWindow. El size box
tiene el tamaño por defecto para los size
Estilo Significado
Indica que un bitmap será mostrado
en el control static. El texto
proporcionado será el nombre de un
bitmap (no un nombre de fichero)
definido en otro lugar en el fichero
SS_BITMAP
de recursos. Este estilo ignora los
parámetros nWidth y nHeight; el
control se redimensiona
automáticamente para acomodarse
al bitmap.
Indica una caja con un marco que se
pintará del mismo color que los
SS_BLACKFRAME marcos de la ventana. Este color es
negro en el esquema de color por
defecto en Windows.
Indica un rectángulo relleno con el
color de frame actual. Este color es
SS_BLACKRECT
negro en el esquema de color por
defecto en Windows.
Indica un simple rectángulo y centra
el texto suministrado en su interior.
El texto será formateado antes de
SS_CENTER mostrarse. Las palabras que excedan
el final de la línea se pasarán
automáticamente al principio de la
siguiente que será centrada también.
Indica el punto medio del control
static con el estilo SS_BITMAP o
SS_ICON que permanecerá fijo
cuando el control sea
redimensionado. Los cuatro lados
serán ajustados para adaptarse al
nuevo bitmap o icono.
SS_CENTERIMAGE
Si un control estatic tiene el estilo
SS_BITMAP y el bitmap es más
pequeño que el área de cliente del
control, el área de cliente se
rellenará con el color del pixel en la
esquina superior izquierda del
Estilo Significado
Especifica que una ventana
WS_EX_ACCEPTFILES creada con este estilo acepta el
arrastre y pegado de ficheros.
Incluye un signo de
interrogación en la barra de
título de la ventana. Cuando el
usuario hace clic sobre ella, el
cursor cambia a un puntero con
una interrogación. Si entonces
el usuario hace clic sobre una
ventana hija, la ventana hija
recibe un mensaje WM_HELP.
WS_EX_CONTEXTHELP La ventana hija debe pasar el
mensaje al procedimiento de
ventana de su ventana padre, el
cual debe llamar a la función
WinHelp usando el comando
HELP_WM_HELP. La
aplicación de ayuda muestra una
ventana pop-up que
normalmente contiene ayuda
sobre la ventana hija.
Permite al usuario navegar a
WS_EX_CONTROLPARENT través de las ventanas hija de la
ventana usando la tecla TAB.
Crea una ventana con un borde
doble. A diferencia del estilo
WS_DLGFRAME, una
WS_EX_DLGMODALFRAME aplicación también puede
especificar el estilo
WS_CAPTION para crear una
barra de título para la ventana.
Especifica que una ventana hija
creada con este estilo no pueda
enviar el mensaje
WS_EX_NOPARENTNOTIFY
WM_PARENTNOTIFY a su
ventana padre cuando se crea o
se destruye.
Estilo Significado
Crea una ventana que tiene de
WS_BORDER
borde una línea fina.
Crea una ventana con una barra
WS_CAPTION de título, (incluye el estilo
WS_BORDER).
Crea una ventana hija. Este
WS_CHILD estilo no puede ser usado junto
con el estilo WS_POPUP.
WS_CHILDWINDOW Lo mismo que WS_CHILD.
Excluye el área ocupara por
ventanas hija cuando se pinta
WS_CLIPCHILDREN dentro del la ventana padre. Este
estilo se usa cuando se crea la
ventana padre.
Descarta las áreas relativas de
cada una de las ventanas hijas
restantes; esto es, cuando una
ventana hija concreta recibe in
mensaje WM_PAINT, el estilo
WS_CLIPSIBLINGS excluye el
área ocupada por todas las otras
ventanas hijas superpuestas con
WS_CLIPSIBLINGS la región de la ventana a
actualizar. Si
WS_CLIPSIBLINGS no se
especifica y la ventanas hija se
superponen, es posible, cuando
se dibuja en el área de cliente de
la ventana hija, que se pinte
dentro del área de cliente de la
ventana hija colindante.
Crea una ventana que
inicialmente está deshabilitada.
WS_DISABLED
Una ventana deshabilitada no
puede recibir datos del usuario.
Crea una ventana con un estilo
de borde típico de los cuadros de
WS_DLGFRAME diálogo. Una ventada con éste
estilo no puede tener una barra
de título.
LPVOID lpCreateParams;
HINSTANCE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
LPCTSTR lpszName;
LPCTSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCT;
Descripción:
lpCreateParams: puntero a datos a usar para crear una ventana.
Windows NT: este miembro es la dirección de un valor SHORT (16 bits) que
especifica el tamaño en bytes delos datos para la creación de la ventana. El valor es
seguido a continuación por los datos. Para mayor información, consulta la sección
de observaciones.
lpszName: apunta a una cadena (terminada con cero) que especifica el nombre de
la nueva ventana.
lpszClass: apunta a una cadena (teminada con cero) que especifica el nombre de la
clase de la nueva ventana.
Observaciones:
Windows NT: con referencia a l miembro lpCreateParams de la estructura
CREATESTRUCT, ya que el puntero muede no estar alineado como DWORD,
una aplicación debe acceder a los datos usando un puntero que haya sido declarado
usando el tipo UNALIGNED, como se muestra en el siguiente ejemplo:
PMYDLGDATA pMyDlgdata =
(PMYDLGDATA) (((LPCREATESTRUCT) lParam)->lpcreateParams);
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO;
Descripción:
ptReserved: reservado, no usar.
Descripción:
hwnd: identificador de la ventana cuyo procedimiento de ventana recibirá el
mensaje.
Descripción:
cbSize: especifica el tamaño en bytes de la estructura.
Valor Significado
SIF_ALL Combinación de SIF_PAGE, SIF_POS y SIF_RANGE.
Este valor sólo se usa para se modifican parámetros de
scrollbars. Si los nuevos parámetros hacen que el scrollbar
SIF_DISABLENOSCROLL
sea innecesario, deshabilita el scrollbar en lugar de
eliminarlo.
El miembro nPage de la estructura SCROLLINFO
SIF_PAGE contiene el tamaño de página para un scrollbar
proporcional.
SIF_POS El miembro nPos contiene la posición de la caja de scroll.
Los miembros nMin y nMax contienen los valores mínimo
SIF_RANGE
y máximo del rango de desplazamiento.
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
Esta estructura se usa junto con la función CreateProcess para definir las
propiedades de la ventana principal si se crea una nuev aventana para un proceso
nuevo. Para procesos con interfaz gráfico de usuario (GUI), ésta información
afecta a la primera ventana creada con la función CreateWindow. Para procesos de
consola, ésta información afecta a la ventana de consola si el proceso crea una
nueva ventana de consola. Un proceso puede usar la función GetStartupInfo para
recuperar la estructura STARTUPINFO especificada cuando un proceso fue
creado.
Descripción:
cb: especifica el tamaño en bytes de la estructura.
lpDesktop:
Windows 95: ignora este miembro.
Windows NT: apunta a una cadena (terminada con cero) que especifica o bien el
nombre del escritorio sólo o bien ambos: el nombre de la estación de ventanas y
Valor Significado
Si no es especifica este valor, el
STARTF_USESHOWWINDOW miembro wShowWindow
member será ignorado.
Si no se especifica este valor,
STARTF_USEPOSITION los miembros dwX y dwY serán
ignorados.
Si no se especifica este valor,
STARTF_USESIZE
los miembros dwXSize y
*feedback: retroalimentación.
Si se especifica, se eliminará el
cursor "feedback" durante el
arranque del proceso. Se
STARTF_FORCEOFFFEEDBACK mostrará el cursor normal. Para
más información sobre
"feedback", ver la sección de
observaciones del final.
Si se especifica, el sistema
tratará la aplicación como un
salva pantallas:
STARTF_SCREENSAVER
• El sistema permite a la
aplicación iniciarse en la
Si no se especifica, se ignoraran
los miembros hStdInput,
hStdOutput y hStdError de la
estructura STARTUPINFO.
Observaciones:
Si un proceso GUI está comenzado y ni STARTF_FORCEONFEEDBACK ni
STARTF_FORCEOFFFEEDBACK fueron especificados, se usará el proceso de
cursor "feedback". Un proceso GUI es uno cuyo subsistema es especificado como
"windows."
Descripción:
style: Es un entero de 16 bits que codifica el estilo de la clase de ventana. Estos
bits se pueden combinar con la función OR (|), para obtener estilos con
lascaracterísticas deseadas.
Valor Significado
Hace que el área de cliente
coincida con el límite de un byte
en la dirección de las x. Esto
CS_BYTEALIGNCLIENT mejora las prestaciones a la hora de
pintar en la pantalla. Este estilo
afecta tanto al ancho de la ventana
como a su posición en la pantalla.
Lo mismo que el anterior, pero con
CS_BYTEALIGNWINDOW el borde de la ventana, en lugar del
área de cliente.
Crea un DC (Device Context) que
será compartido por todas las
ventanas de la misma clase.
CS_CLASSDC Cuando varias ventanas intenten
acceder simultaneamente al DC, el
sistema operativo permite sólo a
una el acceso hasta que termina.
Envía los mensaje de doble-clic al
CS_DBLCLKS
procedimiento de la ventana,
Sintaxis:
BOOL AppendMenu(
HMENU hMenu, // manipulador de menú
UINT uFlags, // flags del ítem de menú
UINT uIDNewItem, // identificador de ítem de menú o manipulador de menú
pop-up
LPCTSTR lpNewItem // conternido del ítem de menú
);
Parámetros:
hMenu: identifica el menú a modificar.
Valor Descripción
MF_BITMAP Contiene un manipulador de bitmap.
Contiene un valor de 32 bits suministrado
por la aplicación que puede ser usado para
mantener datos adicionales relacionados
con el ítem de menú. El valor esta en el
miembro itemData member de la
MF_OWNERDRAW estructura apuntada por el parámetro
lparam del mensaje
WM_MEASUREITEM o
WM_DRAWITEM enviado cuando el
menú es creado o su apariencia es
actualizada.
MF_STRING Contiene un puntero a una cadena de
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
La aplicación debe llamar a la función DrawMenuBar cada vez que el menú
cambie, tanto si el menú pertenece a una ventana que se está mostrando como si
no.
Valor Descripción
Usa un bitmap como ítem. El
MF_BITMAP parámetro lpNewItem contiene el
manipulador del bitmap.
Pone una marca de comprobación
junto al ítem. Si la aplicación
proporciona los bitmaps de las marcas
MF_CHECKED de comprobación (ver
SetMenuItemBitmaps), éste flag
muestra la marca junto al ítem de
menú.
Deshabilita el ítem de menú de modo
MF_DISABLED que no puede ser seleccionado, pero
éste flag no pone el ítem en gris.
Habilita en ítem de menú de modo que
MF_ENABLED pueda ser seleccionado y restaura su
apariencia si su estado estaba en gris.
Deshabilita el ítem y lo muestra en gris
MF_GRAYED de modo que no puede ser
seleccionado.
Funciona igual que el flag
MF_MENUBREAK excepto para
MF_MENUBARBREAK menús pop-up, donde la nueva
columna es separada de la anterior por
una línea vertical.
Coloca el ítem en una línea nueva
MF_MENUBREAK (para barras de menú) o en una
columna nueva (para menús pop-up)
La lista siguiente muestra grupos de flags que no pueden ser usados juntos:
Sintaxis:
HMENU CreateMenu(VOID)
Parámetros:
Esta función no tiene parámetros.
Valor de retorno:
Si la función tiene éxito el valor de retorno será el manipulador del nuevo menú
creado.
Observaciones:
Los recursos asociados con el menú que es asignado a una ventana son liberados
automáticamente cuando la ventana es destruida. Si el menú no está asignado a una
ventana, la aplicación debe liberar los recursos del sistema asociados con el menú
antes de cerrar. Una aplicación libera los recursos de menú llamando a la función
DestroyMenu.
Sintaxis:
HWND CreateWindow(
LPCTSTR lpClassName, // puntero al nombre de la clase registrada
LPCTSTR lpWindowName, // puntero al nombre de la ventana
DWORD dwStyle, // estilo de ventana
int x, // posición horizontal de la ventana
int y, // posición vertical de la ventana
int nWidth, // anchura de la ventana
int nHeight, // altura de la ventana
HWND hWndParent, // manipulador de la ventana padre o propietaria
HMENU hMenu, // manipulador de menú o identificador de ventana hija
HANDLE hInstance, // manipulador de la instancia de la aplicación
LPVOID lpParam // puntero a los datos para la creación de la ventana
);
Parámetros:
lpClassName: puntero a una cadena terminada con cero o un átomo entero. Si el
parámetro es un átomo, debe ser un átomo global creado previamente con una
llamada a la función GlobalAddAtom. El átomo, un valor de 16 bits menor de
0xC000, debe estar eb la palabra de menor orden de lpClassName; la palabra de
mayor orden debe ser cero.
dwStyle: especifica en estilo de la ventana que se creará. Este parámetro debe ser
una combinación de los estilos de ventana y de los estilos de controles que se listan
en el apartado de observaciones.
Valor de retorno:
Si al función tiene éxito, el valor de retorno es el manipulador de la nueva ventana.
Observaciones:
Antes de volver, CreateWindow envía un mensaje WM_CREATE al
procedimiento de ventana.
Clase Significado
Designa una pequeña ventana rectangular que
representa un botón que el usuario puede pulsar
para encenderlo o apagarlo. Estos controles
BUTTON pueden ser usados solos o en grupos, también
pueden tener etiquetas o aparecer sin texto. Estos
controles normalmente cambian de aspecto
cuando el usuario los pulsa.
COMBOBOX Designa un control que consiste en un list box y
Sintaxis:
LRESULT DefWindowProc(
HWND hWnd, // manipulador de la ventana
UINT Msg, // identificador de mensaje
WPARAM wParam, // primer parámetro del mensaje
LPARAM lParam // segundo parámetro del mensaje
);
Parámetros:
hwnd: es el manipulador de la ventana a la que está destinado el mensaje.
Valor de retorno:
El valor de retorno es el resultado del proceso del mensaje, y depende del tipo de
mensaje. The return value is the result of the message processing and depends on
the message.
Sintaxis:
BOOL DestroyMenu(
HMENU hMenu // manipulador del menú a destruir
);
Parámetros:
hMenu: identifica el menú a destruir.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
Antes de cerrar, una aplicación debe usar ésta función para destruir un menú que
no esté asignado a una ventana. Un menú que esté asignado a una ventana es
automáticamente destruído cuando la aplicación se cierra.
Sintaxis:
int DialogBox(
HANDLE hInstance, // manipulador a la instancia de la aplicación
LPCTSTR lpTemplate, // identifica el recurso de cuadro de diálogo
HWND hWndParent, // manipulador a la ventana propietaria
DLGPROC lpDialogFunc // dirección del procedimiento de diálogo
);
Parámetros:
hInstance: identifica una instancia del múdulo cuyo fichero ejecutable contiene la
plantilla del cuadro de diálogo.
lpTemplate: identifica la plantilla del cuadro de diálogo. Este parámetro puede ser
la dirección de una cadena de caracteres terminada en cero que especifique el
nombre de la plantilla o un valor entero que especifique el identificador de recurso
de la plantilla. Si el parámetro se refiere a un identificador de recurso, su palabra
de mayor peso debe ser cero y la de menor peso contendrá el identificador. Se
puede usar la macro MAKEINTRESOURCE para crear este valor.
Valor de retorno:
Si la función tiene éxito, el valor de retorno será el parámetro nResult en la llamada
a la función EndDialog usada para terminar el diálogo.
Observaciones:
La función DialogBoxIndirect usa la función CreateWindowEx para crear el
cuadro de diálogo. Entonces DialogBox envía un mensaje WM_INITDIALOG (y
un mensaje WM_SETFONT si la plantilla especifica el estilo DS_SETFONT) al
Sintaxis:
BOOL CALLBACK DialogProc(
HWND hwndDlg, // Manipulador de cuadro de diálogo
UINT uMsg, // Mensaje
WPARAM wParam, // Parámetro palabra, varía
LPARAM lParam // Parámetro doble palabra, varía
);
Parámetros:
hwndDlg: es el manipulador de la ventana que identifica el cuadro de diálogo.
Valor de retorno:
Excepto en la respuesta al mensaje WM_INITDIALOG, el procedimiento de
diálogo debe retornar 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 diálogo. En otro caso, debe retornar un valor distinto de
cero, en ese caso el sistema pondrá el foco en el primer control del diálogo que
pueda recibirlo.
Observaciones:
Se debe usar el procedimiento de diálogo sólo si se usa una clase de diálogo para el
cuadro de diálogo. Esta es la clase por defecto y se usa cuando no se toma una
clase explícitamente en la plantilla del cuadro de diálogo. A pesar de que el
procedimiento de diálogo es similar al procedimiento de ventana, nunca debe
llamar a la función DefWindowProc para procesar mensajes no deseados. Estos
mensajes son procesados internamente por el procedimiento de ventana del cuadro
de diálogo.
Sintaxis:
LONG DispatchMessage(
CONST MSG *lpmsg // puntero a una estructura con el mensaje
);
Parámetros:
lpmsg: puntero a una estructura MSG que contiene el mensaje.
Valor de retorno:
Especifica el valor retornado por el procedimiento de ventana. Su significado
depende del tipo de mensaje, aunque este valor suele ser ignorado.
Observaciones:
La estructura MSG debe contener valores de mensaje válidos. Si el parámetro
lpmsg apunta a un mensaje de tipo WM_TIMER y el parámetro lParam del
mensaje WM_TIMER no es NULL, entonces lParam apunta a la función que será
llamada en lugar del procedimiento de ventana.
Sintaxis:
BOOL DrawMenuBar(
HWND hWnd // manipulador de ventana con la barra de menú a actualizar
);
Parámetros:
hWnd: identifica a la ventana cuya barra de menú necesita repintarse.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Sintaxis:
BOOL EndDialog(
HWND hDlg, // manipulador del cuadro de diálogo
int nResult // valor de retorno
);
Parámetros:
hDlg: identifica el cuadro de diálogo a destruir.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
Los cuadros de diálogo creados por las funciones DialogBox, DialogBoxParam,
DialogBoxIndirect y DialogBoxIndirectParam debes ser destruidos con la función
EndDialog. Una aplicación debe llamar a EndDialog desde el interior del
procedimiento de diálogo; la función no debe ser usada con ningún otro propósito.
Sintaxis:
HWND GetDlgItem(
HWND hDlg, // manipulador del cuadro de diálogo
int nIDDlgItem // identificador del control
);
Parámetros:
hDlg: identifica el cuadro de diálogo que contiene el contol.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es el manipulador de la ventana del
control.
Observaciones:
Se puede usar GetDlgItem con cualquiere pareja de ventanas padre-hija, no sólo
con cuadrod de diálogo. Siempre que el parámetro hDlg especifique una ventana
padre y la ventana hija tenga un identificador único (tal como se especifica en el
parámetro hMenu de la función CreateWindow o CreateWindowEx de la ventana
hija creada), GetDlgItem devolverá un manipulador válido a la ventana hija.
Sintaxis:
UINT GetDlgItemInt(
HWND hDlg, // manipulador al cuadro de diálogo
int nIDDlgItem, // identificador del control
BOOL *lpTranslated, // apunta a una varieble que recibirá el indicador de
éxito/fracaso
int bSigned // especifica si el valor es con o sin signo
);
Parámetros:
hDlg: identifica al cuadro de diálogo que contienen el control.
Este parámetro es opcional: puede ser NULL. En éste caso, la función no devuelve
información sobre el éxito.
Valor de retorno:
Si la función tiene éxito, se asignará TRUE a la variable apuntada por lpTranslated
y el valor de retorno será el valor del texto en el interior del control edit.
Sintaxis:
UINT GetDlgItemText(
HWND hDlg, // manipulador al cuadro de diálogo
int nIDDlgItem, // identificador del control
LPCTSTR lpString, // dirección del buffer de texto
int nMaxCount // máximo tamaño de la cadena
);
Parámetros:
hDlg: identifica al cuadro de diálogo que contienen el control.
Valor de retorno:
Si la función tiene éxito, el valor de retorno indicará el número de caracteres
copiados a buffer, sin incluir el carácter nulo de terminación.
Observaciones:
La función GetDlgItemText envía un mensaje WM_GETTEXT al control
especificado.
Sintaxis:
BOOL GetMessage(
LPMSG lpMsg, // puntero a la estructura que contendrá el mensaje
HWND hWnd, // manipulador de ventana
UINT wMsgFilterMin, // primer mensaje
UINT wMsgFilterMax // último mensaje
);
Parametros:
lpMsg: puntero a una estructura de tipo MSG que recibirá la información sobre el
mensaje procedente de la lista de mensajes del proceso.
Valor de retorno:
Si la función recibe un mensaje distinto de WM_QUIT, el valor de retorno es
TRUE. Si recibe WM_QUIT, retornará con FALSE. Si hubo un error, retornará
con -1. Por ejemplo la función falla si se llama con un manipulador de ventana no
válido.
Observaciones:
Normalmente, el valor de retorno se usa para detectar el final del bucle de
mensajes y salir del programa.
Observa que la función puede retornar con TRUE, FALSE, o -1. Así que se debe
evitar usar expresiones como:
Sintaxis:
BOOL GetScrollInfo(
HWND hwnd, // manipulador de la ventana con el scrollbar
int fnBar, // flag del scrollbar
LPSCROLLINFO lpsi, // puntero a estructura con los parámetros de
desplazamiento
);
Parámetros:
hwnd: identifica el control scrollbar o la ventana con un scrollbar estándar,
dependiendo del valor del parámetro fnBar.
Valor Significado
Recupera los parámetros de un control scrollbar. El parámetro hwnd debe
SB_CTL
ser un manipulador del control scrollbar.
SB_HORZ Recupera los parámetros del scrollbar estándar horizontal de una ventana.
SB_VERT Recupera los parámetros del scrollbar estándar vertical de una ventana.
lpsi: puntero a una estructura SCROLLINFO cuyo miembro fMask, especifica los
parámetros del scrollbar a recuperar. Antes de retornar, la función copia los
parámetros especificados a los miembros apropiados de la estructura.
Valor Significado
SIF_ALL Combinación de SIF_PAGE, SIF_POS y SIF_RANGE.
Copia el valor de la página de desplazamiento al miembro nPage de la
SIF_PAGE
estructura SCROLLINFO apuntada por lpsi.
Copia el valor de la posición de desplazamiento al miembro nPos de la
SIF_POS
estructura SCROLLINFO apuntada por lpsi.
Valor de retorno:
Si la función recupera algún valor, retorna con TRUE. Si no recupera ninguno el
valor de retorno es FALSE.
Observaciones:
La función GetScrollInfo permite usar posiciones de desplazamiento de 32-bits.
Como los mensajes que indican posiciones de scrollbar, WM_HSCROLL y
WM_VSCROLL, están limitados a 16 bits para el dato de la posición, las
funciones SetScrollInfo y GetScrollInfo suministran valores de posiciones de 32
bit. Así que, una aplicación puede llamar a GetScrollInfo mientras procesas
mensajes WM_HSCROLL o WM_VSCROLL para obtener posiciones de 32-bits.
Sintaxis:
int GetScrollPos(
HWND hWnd, // manipulador de la ventana con el scrollbar
int nBar // flag de scrollbar
Parámetros:
hWnd: identifica el control scrollbar o la ventana con un scrollbar estándar,
dependiendo del valor del parámetro nBar.
Valor Significado
Recupera la posición de la caja de desplazamiento de un control scrollbar.
SB_CTL
El parámetro hwnd debe ser un manipulador del control scrollbar.
Recupera la posición de la caja de desplazamiento del scrollbar estándar
SB_HORZ
horizontal de una ventana.
Recupera la posición de la caja de desplazamiento del scrollbar estándar
SB_VERT
vertical de una ventana.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es el valor de la posición actual de la
caja de desplazamiento.
Observaciones:
La función GetScrollPos permite a las aplicaciones usar posiciones de scroll de 32-
bits. A pesar de que los mensajes que indican posiciones de scrollbar,
WM_HSCROLL y WM_VSCROLL, están limitadas a posiciones de 16 bits, las
funciones SetScrollPos, SetScrollRange, GetScrollPos y GetScrollRange soportan
posiciones de scrollbar de 32-bit. De modo que una aplicación puede llamar a
Para Windows 95, esta función existe por compatibilidad con versiones de sistemas
operativos anteriores a la 4.0. Para la versión 4.0 o superiores, debe usarse la
función GetScrollInfo.
Sintaxis:
BOOL GetScrollRange(
HWND hWnd, // manipulador de la ventana con el scrollbar
int nBar, // flag del scrollbar
LPINT lpMinPos, // dirección de la variable que recibe la posición mínima
LPINT lpMaxPos // dirección de la variable que recibe la posición máxima
);
Parámetros:
hWnd: identifica el control scrollbar o la ventana con un scrollbar estándar,
dependiendo del valor del parámetro nBar.
Valor Significado
Recupera el rango de un control scrollbar. El parámetro hwnd debe ser un
SB_CTL
manipulador del control scrollbar.
SB_HORZ Recupera el rango del scrollbar estándar horizontal de una ventana.
SB_VERT Recupera el rango del scrollbar estándar vertical de una ventana.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Sintaxis:
BOOL InsertMenu(
HMENU hMenu, // manipulador de menú
UINT uPosition, // ítem de menú al que el nuevo ítem precederá
UINT uFlags, // flags del ítem de menú
UINT uIDNewItem, // identificador de ítem de menú o manipulador de menú
pop-up
LPCTSTR lpNewItem // contenido del ítem de menú
);
Parámetros:
hMenu: identifica el menú a modificar.
uPosition: indica el ítem de menú delante del cual se insertará el nuevo, tal como
se determine por el parámetro uFlags.
uFlags: especifica los flags para controlar la interpretación del parámetro yPosition
y el contenido, apariencia y el comportamiento del ítem de menú. Este parámetro
puede ser una combinación de uno de los valores requeridos siguientes y por lo
menos uno de los valores listados en la sección de observaciones.
Valor Descripción
Indica que el parámetro uPosition toma el
identificador del ítem de menú. El flag
MF_BYCOMMAND es el valor por
MF_BYCOMMAND
defecto si no se indica el flag
MF_BYCOMMAND ni
MF_BYPOSITION.
Indica que el parámetro uPosition toma la
posición relativa, basada en cero del nuevo
MF_BYPOSITION ítem de menú. Si uPosition es
0xFFFFFFFF, el nuevo ítem se añadirá al
final del menú.
Valor Descripción
MF_BITMAP Contiene un manipulador de bitmap.
Contiene un valor de 32 bits suministrado
por la aplicación que puede ser usado para
mantener datos adicionales relacionados
con el ítem de menú. El valor esta en el
miembro itemData member de la
MF_OWNERDRAW estructura apuntada por el parámetro
lparam del mensaje
WM_MEASUREITEM o
WM_DRAWITEM enviado cuando el
menú es creado o su apariencia es
actualizada.
Contiene un puntero a una cadena de
MF_STRING
caracteres terminada con cero.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
La aplicación debe llamar a la función DrawMenuBar cada vez que el menú
cambie, tanto si el menú pertenece a una ventana que se está mostrando como si
no.
Valor Descripción
Usa un bitmap como ítem. El
MF_BITMAP parámetro lpNewItem contiene el
manipulador del bitmap.
Pone una marca de comprobación
junto al ítem. Si la aplicación
proporciona los bitmaps de las marcas
MF_CHECKED
de comprobación (ver
SetMenuItemBitmaps), éste flag
muestra la marca junto al ítem de
La lista siguiente muestra grupos de flags que no pueden ser usados juntos:
• MF_BYCOMMAND y MF_BYPOSITION
• MF_DISABLED, MF_ENABLED y MF_GRAYED
• MF_BITMAP, MF_STRING, MF_OWNERDRAW y MF_SEPARATOR
• MF_MENUBARBREAK y MF_MENUBREAK
• MF_CHECKED y MF_UNCHECKED
Sintaxis:
HMENU LoadMenu(
HINSTANCE hInstance, // manipulador de instancia de la aplicación
LPCTSTR lpMenuName // cadena con el nombre del menú o
identificador de recurso de menú
);
Parámetros:
hInstance: identifica la instancia del módulo que contiene el recurso de menú a
cargar.
lpMenuName: apunta a una cadena terminada en cero que contiene el nombre del
recurso de menú. Alternativamente, éste parámetro puede ser un identificador de
recurso en la palabra de menor peso y cero en la de mayor peso. Para crear éste
valor usar la macro MAKEINTRESOURCE.
Valor de retorno:
Si la función tiene éxito el valor de retorno será el manipulador del recurso de
menú cargado.
Observaciones:
Se usa la función DestroyMenu, antes de cerrar la aplicación, para destruir el menú
y liberar la memoria ocupada por el menú cargado.
Sintaxis:
int MessageBox(
HWND hWnd, // manipulador de la ventana propietaria
LPCTSTR lpText, // dirección del texto del mensaje
LPCTSTR lpCaption, // dirección del texto del título
UINT uType // estilo del cuadro de mensaje
);
Parámetros:
hWnd: identifica a la ventana propietaria del cuadro de mensaje a crear. Si éste
parámetro es NULL, el cuadro de mensaje no tendrá ventana propietaria.
lpText: apunta a una cadena terminada en cero que contiene el mensaje a mostrar.
lpCaption: apunta a una cadena terminada en cero usada como título para el
cuadro de diálogo. Si este parámetro es NULL, se usará el título por defecto de
Error.
Valor Significado
El cuadro de mensaje
MB_ABORTRETRYIGNORE contiene tres botones: Anular,
Reintentar e Omitir.
El usuario debe responder al
cuadro de diálogo antes de
continuar trabajando en la
ventana identificada por el
parámetro hWnd. Sin
embargo, el usuario puede
MB_APPLMODAL trasladarse a ventanas de
otras aplicaciones y trabajar
en sus ventanas.
Dependiendo de la gerarquía
de ventanas de la aplicación,
el usuario puede estar
MB_APPLMODAL es el
valor por defecto si no se
especifica
MB_SYSTEMMODAL ni
MB_TASKMODAL.
El escritorio que actualmente
recibe la entrada debe ser el
escritorio por defecto; en otro
caso, la función falla. Un
MB_DEFAULT_DESKTOP_ONLY
escritorio por defecto es aquel
en que una aplicación se
ejecuta después de que el
usuario ha hecho logon.
El primer botón es el botón
por defecto. Observa que el
primer botón es siempre el
botón por defecto salvo que
MB_DEFBUTTON1
se especifique
MB_DEFBUTTON2,
MB_DEFBUTTON3 o
MB_DEFBUTTON4.
El segundo botón es el botón
MB_DEFBUTTON2
por defecto.
El tercer botón es el botón
MB_DEFBUTTON3
por defecto.
El cuarto botón es el botón
MB_DEFBUTTON4
por defecto.
Windows 95: añade un botón
de ayuda al cuadro de
MB_HELP mensaje. Pulsando el botón
de ayuda o la tecla F1 se
genera un evento de ayuda.
Igual que
MB_ICONASTERISK
MB_ICONINFORMATION.
Windows 95: igual que
MB_ICONERROR
MB_ICONHAND.
MB_ICONEXCLAMATION Se mostrará un icono de
Valor Significado
IDABORT Se seleccionó el botón de Anular.
IDCANCEL Se seleccionó el botón de Cancelar.
IDIGNORE Se seleccionó el botón de Omitir.
IDNO Se seleccionó el botón de No.
IDOK Se seleccionó el botón de Aceptar.
IDRETRY Se seleccionó el botón de Reintentar.
IDYES Se seleccionó el botón de Sí.
Observaciones:
Cuando uses un cuadro de mensaje de tipo para indicar que el sistema está bajo de
memoria, las cadenas apuntadas por los parámetrps lpText y lpCaption no deben
ser tomados desde un fichero de recursose, porque un intento de cargar un recurso
podría fallar.
Sintaxis:
BOOL PostMessage(
HWND hwnd, // manipulador de la ventana de destino
UINT uMsg, // mensaje a enviar
WPARAM wParam, // primer parámetro del mensaje
LPARAM lParam // segundo parámetro del mensaje
);
Parámetros:
hwnd: identifica la ventana cuyo procedimiento de ventana recibirá el mensaje.
Hay dos valores con significados especiales:
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
Sintaxis:
VOID PostQuitMessage(
Parámetros:
nExitCode: indica un código de salida de la aplicación. Este valor será usado
como parámetro wParam del mensaje WM_QUIT.
Valor de retorno:
No tiene valor de retorno.
Observaciones:
La función PostQuitMessage envía un mensaje WM_QUIT a las cola de mensajes
del "hilo" y vuelve inmediatamente; la función indica simplemente al sistema que
el "hilo" está pidiendo salir en algún momento del futuro.
Sintaxis:
ATOM RegisterClass(
CONST WNDCLASS *lpwc // dirección de la estructura con los datos de la
clase
);
Parámetros:
lpwc: puntero a una estructura del tipo WNDCLASS. Es necesario rellenar
adecuadamente la estructura antes de llamar a la función.
Valor de retorno:
Si la función tiene éxito, retorna con un átomo que es un identificador único para la
clase registrada. Si la función falla, retorna con valor nulo. Para conseguir más
información sobre le motivo del error se puede llamar a GetLastError.
Observaciones:
Todas las clases que registre una aplicación dejarán de estarlo cuando la aplicación
termine.
Sintaxis:
LONG SendDlgItemMessage(
HWND hwndDlg, // manipulador del cuadro de diálogo
int idControl, // identificador del control
UINT uMsg, // mensaje a enviar
WPARAM wParam, // primer parámetro del mensaje
LPARAM lParam // segundo parámetro del mensaje
);
Parámetros:
hwndDlg: identifica al cuadro de diálogo que contienen el control.
Valor de retorno:
El valor de retorno especifica el resultado del procesamiento del mensaje y
depende del mensaje enviado.
Observaciones:
La función SendDlgItemMessage no retorna hasta que el mensaje haya sido
procesado.
Sintaxis:
LRESULT SendMessage(
HWND hwnd, // manipulador de la ventana de destino
UINT uMsg, // mensaje a enviar
WPARAM wParam, // primer parámetro del mensaje
LPARAM lParam // segundo parámetro del mensaje
);
Parámetros:
hwnd: identifica la ventana cuyo procedimiento de ventana recibirá el mensaje. Si
este parámetro es HWND_BROADCAST, el mensaje se envía a todas las ventanas
de nivel superior en el sistema, incluyendo las including las deshabilitadas o
invisibles sin dueño, ventanas superpuestas u ventanas pop-up; pero el mensaje no
se envía a las ventanas hijas.
Valor de retorno:
El valor de retorno especifica el resultado del procesamiento del mensaje y
depende del mensaje enviado.
Observaciones:
Si la ventana especificada fue creada por el proceso que llama, el procedimiento de
ventana es llamado inmediatamente como si fuera una subrutina. En caso contrario,
Windows cambia a ese proceso y llama al procedimiento de ventana adecuado.
Sintaxis:
BOOL SetDlgItemInt(
HWND hwndDlg, // manipulador al cuadro de diálogo
int idControl, // identificador del control
UINT uValue, // valor a cambiar
BOOL fSigned // indicador de con o sin signo
);
Parámetros:
hwndDlg: identifica al cuadro de diálogo que contienen el control.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
Para cambiar el nuevo texto, la función SetDlgItemInt envía un mensaje
WM_SETTEXT al control especificado.
Sintaxis:
BOOL SetDlgItemText(
HWND hwndDlg, // manipulador al cuadro de diálogo
int idControl, // identificador del control
LPCTSTR lpsz // texto a poner
);
Parámetros:
hwndDlg: identifica al cuadro de diálogo que contienen el control.
lpsz: puntero a cadena terminada en cero que contiene el texto a ser copiado al
control.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
La función SetDlgItemText envía un mensaje WM_SETTEXT al control
especificado.
Sintaxis:
HWND SetFocus(
HWND hwnd // manipulador a la ventana que recibirá el
foco
);
Parámetros:
hwnd: identifica la ventana que recibirá el foco del teclado. Si este parámetro es
NULL, las pulsaciones del teclado se ignoran.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es el manipulador de la ventana que
tenía previamente el foco del teclado. Si no existe tal ventana, o el parámetro hwnd
es inválido, el valor de retorno es NULL.
Observaciones:
Si la ventana identificada por el parámetro hwnd fue creada por el proceso
llamado, el estado del foco del teclado del proceso llamado se pone a hwnd.
Si una ventana está activa pero no tiene el foco del teclado (es decir, ninguna
ventana tiene el foco), cualquier tecla pulsada producirá un mensaje
WM_SYSCHAR, WM_SYSKEYDOWN o WM_SYSKEYUP. Si la tecla
VK_MENU está pulsada también, el parámetro lParam del mensaje tendrá el bit 30
activado. En otro caso, los mensaje producidos no tendrán este bit activo.
Si una aplicación no está en primer plano, y se quiere que lo esté, debe llamarse a
la función SetForegroundWindow.
Sintaxis:
BOOL SetMenu(
HWND hwnd, // manipulador de ventana
HMENU hmenu // manipulador de menú
);
Parámetros:
hwnd: identifica la ventana a la que se asignará el menú.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Observaciones:
La ventana es redibujada para reflejar el cambio de menú.
Sintaxis:
int SetScrollInfo(
HWND hwnd, // manipulador de la ventana
con el scrollbar
int fnBar, // flag del scrollbar
LPSCROLLINFO lpsi, // puntero a estructura con los
parámetros de desplazamiento
BOOL fRedraw // flag de repintado
);
Parámetros:
hwnd: identifica el control scrollbar o la ventana con un scrollbar estándar,
dependiendo del valor del parámetro fnBar.
Valor Significado
Cambia los parámetros de un control scrollbar. El parámetro hwnd debe ser
SB_CTL
un manipulador del control scrollbar.
SB_HORZ Cambia los parámetros del scrollbar estándar horizontal de una ventana.
SB_VERT Cambia los parámetros del scrollbar estándar vertical de una ventana.
lpsi: puntero a una estructura SCROLLINFO cuyo miembro fMask, especifica los
parámetros del scrollbar a modificar.
Valor Significado
Deshabilita el scrollbar en lugar de eliminarlo, si los
SIF_DISABLENOSCROLL
nuevos parámetros hacen que el scrollbar sea innecesario.
Cambia el valor de la página de desplazamiento al valor
SIF_PAGE especificado por el miembro nPage de la estructura
SCROLLINFO apuntada pro lpsi.
SIF_POS Cambia el valor de la posición de desplazamiento al valor
Valor de retorno:
El valor de retorno es la posición actual de la caja de desplazamiento.
Observaciones:
La función SetScrollInfo realiza una comprobación de los valores especificados
por los miembros nPage y nPos de la estructura SCROLLINFO. El miembro nPage
debe especificar un valor entre 0 y nMax - nMin +1. El miembro nPos debe
especificar un valor entre nMin y nMax - max(nPage - 1, 0). Si alguno de esos
valores está fuera de rango, la función cambia su valor para que tenga un valor
permitido.
Sintaxis:
int SetScrollPos(
HWND hwnd, // manipulador de la ventana con el
scrollbar
int fnBar, // flag de scrollbar
int nPos, // nueva posición de la caja de
desplazamiento
BOOL fRedraw // flag de redibujado
);
Parámetros:
hwnd: identifica el control scrollbar o la ventana con un scrollbar estándar,
dependiendo del valor del parámetro fnBar.
Valor Significado
Cambia la posición de un control scrollbar. El parámetro hwnd debe ser un
SB_CTL
manipulador del control scrollbar.
SB_HORZ Cambia la posición del scrollbar estándar horizontal de una ventana.
SB_VERT Cambia la posición del scrollbar estándar vertical de una ventana.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es el valor anterior de la caja de
desplazamiento.
Sintaxis:
BOOL SetScrollRange(
HWND hwnd, // manipulador de la ventana con el
scrollbar
int fnBar, // flag del scrollbar
int nMinPos, // posición mínima de desplazamiento
int nMaxPos, // posición máxima de desplazamiento
BOOL fRedraw // flag de repintado
);
Parámetros:
hwnd: identifica el control scrollbar o la ventana con un scrollbar estándar,
dependiendo del valor del parámetro fnBar.
Valor Significado
Modifica el rango de un control scrollbar. El parámetro hwnd debe ser un
SB_CTL
manipulador del control scrollbar.
SB_HORZ Modifica el rango del scrollbar estándar horizontal de una ventana.
SB_VERT Modifica el rango del scrollbar estándar vertical de una ventana.
Valor de retorno:
Si la función tiene éxito, el valor de retorno es TRUE.
Sintaxis:
BOOL ShowWindow(
HWND hwnd, // manipulador de ventana
int nCmdShow // modo de visualización de ventana
);
Parámetros:
hwnd: manipulador de ventana. Identifica la ventana.
Valor de retorno:
Si la ventana era visible previamente, el valor de retorno es TRUE. Si la ventana
estaba oculta, el valor de retorno es FALSE.
Observaciones:
Esta función debe ser llamada sólo una vez por programa con el parámetro
nCmdShow de WinMain. Las siguientes llamadas deben usar uno de los valores de
la tabla anterior.
Sintaxis:
BOOL TranslateMessage(
CONST MSG *lpmsg // puntero a la estructura con el mensaje
);
Parámetros:
lpmsg: puntero a una estructura MSG que contiene la información sobre el
mensaje tomado de la lista de mensajes del proceso mediante la función
GetMessage o PeekMessage.
Valor de retorno:
Si el mensaje fue traducido, es decir, si un mensaje de carácter se envió a la lista de
mensajes del proceso, retorna con TRUE; en caso contrario, retorna con FALSE.
Windows NT: la función retorna con TRUE tanto para teclas de función, como
teclas de flechas, teclas de caracteres y o de dígitos.
Observaciones:
Esta función no modifica el mensaje apuntado pos el parámetro lpmsg.
Las aplicaciones que procesen los mensajes de teclas virtuales para otros
propósitos, no deben llamar a la función TranslateMessage. Por ejemplo, una
aplicación no debería llamar a TranslateMessage si la función TranslateAccelerator
retorna con TRUE.
Sintaxis:
LRESULT CALLBACK WindowProc(
HWND hwnd, // Manipulador de ventana
UINT msg, // Mensaje
WPARAM wParam, // Parámetro palabra, varía
LPARAM lParam // Parámetro doble palabra, varía
);
Parámetros:
hwnd: es el manipulador de la ventana a la que está destinado el mensaje.
Valor de retorno:
El valor de retorno es el resultado de procesar el mensaje y depende del tipo de
mensaje enviado.
Observaciones:
WindowProc es una especie de comodín, un témino que se debe sustituir por un
nombre de función en la definición de una aplicación.
Sintaxis:
int WINAPI WinMain(
HINSTANCE hInstance, // manipulador de la instancia
actual
HINSTANCE hPrevInstance, // manipulador de la instancia
previa
LPSTR lpszCmdLine, // puntero a la línea de comando
int nCmdShow // estado de visualización de la
ventana
);
Parámetros:
hInstance: identifica la instancia actual de la aplicación.
Valor de retorno:
Si la función tiene éxito, terminando cuando recibe el mensaje WM_QUIT, debe
retornar con el valor de salida contenido en el parámetro wParamit del mensaje. Si
la función termina antes de entrar en el bucle de mensajes, debe retornar con 0.
Observaciones:
WinMain inicia un aplicación, y después realiza un bucle de recuperación y envío
de mensajes que es la estructura de control de mayor nivel de toda la ejecución de
la aplicación. El bucle termina cunado se recibe un mensaje WM_QUIT. En ese
punto, WinMain sale de la aplicación, devolviendo el valor pasado por el mensaje
en el parámetro wParam. Si el mensaje WM_QUIT fue recibido como resultado de
una llamada a PostQuitMessage, el valor del parámetro wParam es el valor del
parámetro nExitCode de la función PostQuitMessage.
Definición:
WORD LOWORD(
DWORD dwValue // valor desde el que se extrae la palabra
);
Descripción:
dwValue: especifica el valor a convertir.
Valor de retorno:
El valor de retorno es la palabra de menor peso del valor especificado.
Observaciones:
La macro LOWORD está definida como sigue:
Definición:
LPTSTR MAKEINTRESOURCE(
WORD wInteger // entero a convertir
);
Descripción:
wInteger: especifica el valor entero a convertir.
Valor de retorno:
El valor de retorno es el valor especificado en la palabra de menor orden y cero en
la de mayor orden.
Observaciones:
El valor de retorno sólo debe ser pasado a funciones de manejo de recursos de
Win32, como el parámetro lpType. La macro MAKEINTRESOURCE está
definida así:
Descripción:
lpsz: valor de lParam. Apunta a la cadena terminada en cero a añadir a la lista. Si
creas un combo box with con el estilo owner-drawn pero sin el estilo
CBS_HASSTRINGS, el valor del parámetro lpsz se almacenará como dato del
ítem (item data) en lugar de la cadena a la que en otro caso apuntaría. El item data
puede ser recuperado o modificado mediante el envío de de mensajes
CB_GETITEMDATA o CB_SETITEMDATA.
Valor de retorno:
El valor de retorno es el índice, empezando en cero, de la cadena en la lista del
combo box. Si ocurre un error, el valor de retorno es CB_ERR. Si no hay suficiente
espacio para almacenar la nueva cadena, devolverá CB_ERRSPACE.
Observaciones:
Si creas un combo box owner-drawn con el estilo CBS_SORT pero sin el estilo
CBS_HASSTRINGS, el mensaje WM_COMPAREITEM será enviado una o más
veces a la ventana propietaria del combo box de modo que el nuevo ítem pueda ser
debidamente colocado en la lista.
Para insertar una cadena en una posición concreta de la lista, usar el mensaje
CB_INSERTSTRING.
Descripción:
indexStart: valor de wParam. Especifica el índice, comenzando en cero, del ítem
anterior al primer ítem en el que se empieza a buscar. Cuando la búsqueda llega al
final del listbox, continúa desde el principio hasta que llegue al ítem cuyo índice es
el especificado por el parámetro indexStart. Si indexStart es -1, se busca en todo el
listbox desde el principio.
lpszFind: valor de lParam. Apunta a una cadena terminada en cero que contiene el
prefijo a buscar. La búsqueda es independiente del tipo, es decir que esta cadena
puede contener cualquier combinación de letras mayúsculas o minúsculas.
Valor de retorno:
Si la búsqueda tuvo éxito, el valor de retorno es el índice del ítem seleccionado. Si
no lo tuvo, el valor de retorno es CB_ERR y la selección actual no cambia.
Observaciones:
Si se crea un combobox con el estilo owner-drawn pero sin el estilo
CBS_HASSTRINGS, entonces el mensaje CB_FINDSTRING depende de si se
usó el estilo CBS_SORT. Si se usó, el sistema envía el mensaje
WM_COMPAREITEM al propietario del combobox para determinar qué ítem
coincide con la cadena especificada. Si no se usó, CB_FINDSTRING buscará un
ítem que coincida con el valor del parámetro lpszFind.
Descripción:
indexStart: valor de wParam. Especifica el índice, comenzando en cero, del ítem
anterior al primer ítem en el que se empieza a buscar. Cuando la búsqueda llega al
final del listbox, continúa desde el principio hasta que llegue al ítem cuyo índice es
el especificado por el parámetro indexStart. Si indexStart es -1, se busca en todo el
listbox desde el principio.
lpszFind: valor de lParam. Apunta a una cadena terminada en cero que contiene la
cadena a buscar. Esta cadena puede contener un nombre de fichero completo,
incluyendo la extensión. La búsqueda es independiente del tipo, es decir que esta
cadena puede contener cualquier combinación de letras mayúsculas o minúsculas.
Valor de retorno:
Si la búsqueda tuvo éxito, el valor de retorno es el índice del ítem seleccionado. Si
no lo tuvo, el valor de retorno es CB_ERR y la selección actual no cambia.
Observaciones:
Si se crea un combobox con el estilo owner-drawn pero sin el estilo
CBS_HASSTRINGS, entonces el mensaje CB_FINDSTRINGEXACT depende de
si se usó el estilo CBS_SORT. Si se usó, el sistema envía el mensaje
WM_COMPAREITEM al propietario del combobox para determinar qué ítem
coincide con la cadena especificada. Si no se usó, CB_FINDSTRINGEXACT
buscará un ítem que coincida con el valor del parámetro lpszFind.
Descripción:
Este mensaje no tiene parámetros.
Valor de retorno:
El valor de retorno es el índice (empezando en cero) del ítem actualmente
seleccionado. Si no hay selección, el valor de retorno es CB_ERR.
Descripción:
index: valor de wParam. Indica el índice, comenzando en cero, de la cadena a
recuperar.
Valor de retorno:
El valor de retorno es la longitud de la cadena en bytes, sin contar el carácter nulo
de terminación. Si el parámetro index no especifica un valor de índice válido, el
valor de retorno será CB_ERR.
Observaciones:
Si se crea un combobox con el estilo owner-drawn pero sin el estilo
CBS_HASSTRINGS, el buffer apuntado por el parámetro lpszBuffer del mensaje
recibirá el valor de 32 bits asociado con el ítem (el item data).
Descripción:
index: valor de wParam. Especifica el índice, comenzando en cero, de la cadena a
recuperar.
Valor de retorno:
El valor de retorlo en la longitud de la cadena, en caracteres, excluyendo el
terminador nulo. Bajo algunas condiciones, éste valor puede ser más grande que la
longitud del texto. Para mayor información, ver la sección de observaciones.
Observaciones:
Bajo algunas condiciones, éste valor puede ser más grande que la longitud del
texto. Esto ocurre con ciertas mezclas de ANSI y Unicode, y es debido a que el
sistema operativo permite la posible existencia de juegos de caracteres de boble
byte (DBCS) en el texto. El valor de retorno, sin embargo, será siempre por lo
menos tan largo como el tamaño actual del texto; y puede ser usado siempre como
guía para obtener memoria para el buffer. Este comportamiento puede ocurrir
cuando una aplicación use funciones ANSI y diálogos comunes, junto con
Unicode.
Para obtener la longitud exacta del texto, usar los mensajes WM_GETTEXT,
LB_GETTEXT o CB_GETLBTEXT, o la función GetWindowText.
Descripción:
indexStart: valor de wParam. Especifica el índice, comenzando en cero, del ítem
anterior al primer ítem en el que se empieza a buscar. Cuando la búsqueda llega al
final del listbox, continúa desde el principio hasta que llegue al ítem cuyo índice es
el especificado por el parámetro indexStart. Si indexStart es -1, se busca en todo el
listbox desde el principio.
lpszSelect: valor de lParam. Apunta a una cadena terminada en cero que contiene
el prefijo a buscar. La búsqueda es independiente del tipo, es decir que esta cadena
puede contener cualquier combinación de letras mayúsculas o minúsculas.
Valor de retorno:
Si la búsqueda tuvo éxito, el valor de retorno es el índice del ítem seleccionado. Si
no lo tuvo, el valor de retorno es CB_ERR y la selección actual no cambia.
Observaciones:
Un ítem está seleccionado sólo si sus caracteres iniciales coinciden con la cadena
especificada en el parámetro lpszSelect.
Descripción:
cchMax: valor de wParam. Especifica el número máximo de caracteres que el
usuario puede introducir. Si este parámetro es cero, la longitud del texto se limita a
0x7FFFFFFE caracteres para controles edit de una sóla línea o a 0xFFFFFFFF para
controles edit multilínea.
Valor de retorno:
Este mensaje no devuelve valores.
Observaciones:
El mensaje EM_LIMITTEXT limita sólo el texto que el usuario puede introducir.
Eso no afecta a ningún texto que ya esté en el control edit cuando el mensaje es
enviado, tampoco afecta a la longitud del texto copiado al control edit mediante el
mensaje WM_SETTEXT. Si una aplicación usa el mensaje WM_SETTEXT para
colocar más texto en un control edit del que se limitó mediante el mensaje
EM_LIMITTEXT, el usuario podrá editar el contenido completo del control edit..
El límite de texto por defecto que un usuario puede introducir en un control edit es
de 30000 caracteres.
Descripción:
lpsz: valor de lParam. Apunta a la cadena terminada con cero que será añadida.
Valor de retorno:
El valor de retorno es el índice de la cadena en el listbox, los valores del índice
empiezan en cero. Si ocurre un error, el valor de retorno es LB_ERR. Si no hay
suficiente espacio para almacenar la nueva cadena, el valor de retorno será
LB_ERRSPACE.
Observaciones:
Si se crea un listbox owner-drawn con el estilo LBS_SORT pero sin el estilo
LBS_HASSTRINGS, el sistema envía el mensaje WM_COMPAREITEM una o
más veces al propietario del listox para colocar el nuevo elemento en el lugar
adecuado del listbox.
Descripción:
Este mensaje no tiene parámetros.
Valor de retorno:
El valor de retorno es el índice (empezando en cero) del ítem actualmente
seleccionado o el ítem base de una selección múltiple.
Observaciones:
Usar el mensaje LB_GETCARETINDEX para recuperar el índice del ítem que
tiene el rectángulo de foco en un listbox de selección múltiple.
Una aplicación envía un mensaje LB_GETTEXT para recuperar una cadena desde
un listbox.
Descripción:
index: valor de wParam. Especifica el índice, comenzando en cero, de la cadena a
recuperar.
Sólo en Windows 95: el parámetro wParam está limitado a valores de 16 bits. Esto
significa que los listbox no pueden contener más de 32767 ítems. Aunque el
número de ítems está restringido, el tamaño total en bytes de los ítems en un
listbox está también limitado por la memoria disponible.
Valor de retorno:
El valor de retorlo en la longitud de la cadena, en caracteres, excluyendo el
terminador nulo. Si el parámetro index no especifica un índice válido, el valor de
retorno es LB_ERR.
Observaciones:
Si se crea un listbox con el estilo owner-drawn pero sin el estilo
LBS_HASSTRINGS, el buffer apuntado por el parámetro lpszBuffer recibirá el
valor de 32 bits asociado con el ítem, (el item data).
Descripción:
index: valor de wParam. Especifica el índice, comenzando en cero, de la cadena a
recuperar.
Sólo en Windows 95: el parámetro wParam está limitado a valores de 16 bits. Esto
significa que los listbox no pueden contener más de 32767 ítems. Aunque el
número de ítems está restringido, el tamaño total en bytes de los ítems en un
listbox está también limitado por la memoria disponible.
Valor de retorno:
El valor de retorlo en la longitud de la cadena, en caracteres, excluyendo el
terminador nulo. Bajo algunas condiciones, éste valor puede ser más grande que la
longitud del texto. Para mayor información, ver la sección de observaciones.
Observaciones:
Bajo algunas condiciones, éste valor puede ser más grande que la longitud del
texto. Esto ocurre con ciertas mezclas de ANSI y Unicode, y es debido a que el
sistema operativo permite la posible existencia de juegos de caracteres de boble
byte (DBCS) en el texto. El valor de retorno, sin embargo, será siempre por lo
menos tan largo como el tamaño actual del texto; y puede ser usado siempre como
guía para obtener memoria para el buffer. Este comportamiento puede ocurrir
cuando una aplicación use funciones ANSI y diálogos comunes, junto con
Unicode.
Para obtener la longitud exacta del texto, usar los mensajes WM_GETTEXT,
LB_GETTEXT o CB_GETLBTEXT, o la función GetWindowText.
Descripción:
indexStart: valor de wParam. Especifica el índice, comenzando en cero, del ítem
anterior al primer ítem en el que se empieza a buscar. Cuando la búsqueda llega al
final del listbox, continúa desde el principio hasta que llegue al ítem cuyo índice es
el especificado por el parámetro indexStart. Si indexStart es -1, se busca en todo el
listbox desde el principio.
Sólo en Windows 95: el parámetro wParam está limitado a valores de 16 bits. Esto
significa que los listbox no pueden contener más de 32767 ítems. Aunque el
número de ítems está restringido, el tamaño total en bytes de los ítems en un
listbox está también limitado por la memoria disponible.
lpszFind: valor de lParam. Apunta a una cadena terminada en cero que contiene el
prefijo a buscar. La búsqueda es independiente del tipo, es decir que esta cadena
puede contener cualquier combinación de letras mayúsculas o minúsculas.
Valor de retorno:
Si la búsqueda tuvo éxito, el valor de retorno es el índice del ítem seleccionado. Si
no lo tuvo, el valor de retorno es LB_ERR y la selección actual no cambia.
Observaciones:
El contenido del listbox es desplazado, si es necesario, para mostrar el ítem
seleccionado.
Un ítem está seleccionado sólo si sus caracteres iniciales coinciden con la cadena
especificada en el parámetro lpszFind.
Descripción:
Este mensaje no tiene parámetros.
Valor de retorno:
Si el mensaje tiene éxito, el valor de retorno es la posición actual de la caja de
desplazamiento en el scrollbar.
Descripción:
lpnMinPos: puntero al valor que recibirá la posición de desplazamiento mínima.
Valor de retorno:
Este mensaje no devuelve ningún valor.
SBM_GETSCROLLINFO
wParam = 0; // no usado, debe ser cero
lParam = (LPARAM) (LPSCROLLINFO) lpsi; // parámetros de scrollbar
Una aplicación envía este mensaje para recuperar los parámetros de un scrollbar,
incluyendo las posiciones mínima y máxima de desplazamiento, el tamaño de la
página y la posición de la caja de desplazamiento (thumb).
Descripción:
lpsi: valor de lParam. Apunta a una estructura SCROLLINFO cuyo miembro
fMask, especifica los parámetros del scrollbar a recuperar. Antes de retornar, la
función copia los parámetros especificados a los miembros apropiados de la
estructura.
Valor Significado
SIF_ALL Combinación de SIF_PAGE, SIF_POS y SIF_RANGE.
Copia el valor de la página de desplazamiento al miembro nPage de la
SIF_PAGE
estructura SCROLLINFO apuntada por lpsi.
Copia el valor de la posición de desplazamiento al miembro nPos de la
SIF_POS
estructura SCROLLINFO apuntada por lpsi.
Copia el rango de desplazamiento a los miembros nMin y nMax de la
SIF_RANGE
estructura SCROLLINFO apuntada por lpsi.
Valor de retorno:
Si el mensaje recupera algún valor, el valor de retorno es TRUE; en caso contrario
será FALSE.
Descripción:
nPos: especifica la nueva posición de la caja de desplazamiento. Debe estar dentro
de los límites del rango de desplazamiento.
Valor de retorno:
Si la posición de la caja ha cambiado, el valor de retorno es el valor anterior de la
posición, en otro caso es cero.
Observaciones:
Si el control scrollbar es redibujado por llamadas posteriores a otras funciones o
mensajes, es corriente usar FALSE como valor del parámetro fRedraw .
Descripción:
lpnMinPos: especifica la posición de desplazamiento mínima.
Valor de retorno:
Si la posición de la caja de desplazamiento cambia, el valor de retorno es la
posición previa de la caja, en otro caso será cero.
Observaciones:
Los valores de las posiciones por defecto mínimo y máximo son cero. La
diferencia entre los valores especificados por los parámetros nMinPos y nMaxPos
no debe ser mayor que el valor de MAXLONG.
SBM_SETSCROLLINFO
wParam = (WPARAM) fRedraw; // flag de redibujado
lParam = (LPARAM) (LPSCROLLINFO) lpsi; // parámetros de scrollbar
Una aplicación envía este mensaje para modificar los parámetros de un scrollbar,
incluyendo las posiciones mínima y máxima de desplazamiento, el tamaño de la
página y la posición de la caja de desplazamiento (thumb).
Descripción:
fRedraw: valor de wParam. Especifica si el scrollbar será redibujado para reflejar
la nueva posición de la caja de desplazamiento. Si este parámetro es TRUE, el
scrollbar es redibujado. Si el FALSE, no.
Valor Significado
SIF_ALL Combinación de SIF_PAGE, SIF_POS y SIF_RANGE.
Modifica el valor de la página de desplazamiento al miembro nPage de la
SIF_PAGE
estructura SCROLLINFO apuntada por lpsi.
Modifica el valor de la posición de desplazamiento al miembro nPos de la
SIF_POS
estructura SCROLLINFO apuntada por lpsi.
Modifica el rango de desplazamiento a los miembros nMin y nMax de la
SIF_RANGE
estructura SCROLLINFO apuntada por lpsi.
Valor de retorno:
El valor de retorno es la posición actual de la caja de desplazamiento.
Descripción:
chCharCode: valor de wParam. Especifica el código de carácter de la tecla.
Valor Descripción
Indica el contador de repetición. El valor es el número de
0—
veces que se repite una tecla como resultado de haber
15
dejado pulsada una tecla.
16— Indica el código de barrido. Depende del fabricante y
23 modelo del equipo.
Indica si la tecla es una tecla extendida, como la tecla
derecha de ALT and CTRL que aparece en el teclado
24
mejorado de 101 o 102 teclas. El valor es uno si es una
tecla extendida y cero si no lo es.
25—
Reservado, no usar.
28
Indica el código de contexto. El valor es 1 si la tecla ALT
29 estaba pulsada mientras la tecla fue pulsada; en caso
contrario es 0.
Indica el estado previo de la tecla. El valor es 1 si la tecla
30 estaba pulsada antes de que fuera enviado el mensaje y 0
si no lo estaba.
Indica el estado de transición. El valor es 1 si la tecla fue
31
liberada o 0 si permacece pulsada.
Valor de retorno:
Observaciones:
Puesto que no es necesario que exista una correspondencia uno a uno entre las
teclas pulsadas y los mensaje de carácter generados, la información en la palabra
alta del parámetro lKeyData normalmente no es útil para las aplicaciones. Esta
información se aplica sólo al mensaje WM_KEYDOWN que precede al mensaje
WM_CHAR más recientemente enviado.
Para teclados mejorados de 101 y 102 teclas, las teclas extendidas son el ALT y el
CTRL derechos en la sección principal del teclado y las teclas INS, DEL, HOME,
END, PAGE UP, PAGE DOWN y las teclas de flechas en el grupo de teclas a la
izquierda del teclado numérico; tambiém la tecla de dividir (/) y ENTER del
teclado numérico. Algunos otros teclados pueden soportar el bit de tecla extendida
en el parámetro lKeyData.
Descripción:
wNotifyCode: valor de la palabra de mayor peso de wParam. Especifica el código
de notificación si el mensaje proviene de un control. Si el mensaje proviene de un
acelerador, éste parámetro es 1. Si el mensaje proviene de un menú, éste parámetro
es 0.
Valor de retorno:
Si una aplicación procesa éste mensaje, debe retornar con cero.
Observaciones:
Los aceleradores de teclado que seleccionan ítems del menú de sistema son
traducidos a mensajes WM_SYSCOMMAND.
El mensaje WM_CREATE se envía cuando una aplicación pide que sea creada una
ventana mediante una llamada a la función CreateWindowEx o CreateWindow. El
procedimiento de ventana de la nueva ventana recibe éste mensaje después de que
la ventana ha sido creada, pero antes de que sea visible. El mensaje es enviado
antes de que la función CreateWindowEx o CreateWindow retorne.
Descripción:
lParam: valor de lParam. Apunta a una estructura CREATESTRUCT que contiene
información sobre la ventana que se está siendo creada. Los miembreos de
CREATESTRUCT son idénticos a los parámetros de la funciónCreateWindowEx.
Valor de retorno:
Si una aplicación procesa este mensaje, debe retornar con 0 para que continue la
creación de la ventana. Si la aplicación retorna con -1, la ventana será destruida y
la función CreateWindowEx o CreateWindow devolverá un manipulador NULL.
Descripción:
Este mensaje no tiene parámetros.
Valor de retorno:
Si una aplicación procesa este mensaje debe retronar cero.
Observaciones:
Si la ventana a destruir es parte de la cadena del visor del portapapeles (hecho
mediante la llamada a la función SetClipboardViewer), al ventana debe eliminarse
a sí misma de la cadena procesando la función ChangeClipboardChain antes de
volver del mensaje WM_DESTROY.
Descripción:
lpmmi: valor del parámetro lParam. Apunta a una estructura MINMAXINFO que
contene la posición y las dimensiones máximas por defecto para la ventana
maximizada, y la posición y los dimensiones máximas y mínimos por defecto para
el tamaño de "traking". Una aplicación puede ignorar los valores por defecto
sobreescribiendo los valores de esta estructura.
Valor de retorno:
Si una aplicación procesa este mensaje, debe retornar cero.
Observaciones:
El máximo tamaño de "tracking" es el tamaño de la ventana más grande que se
puede prodicor usando el borde para cambiar el tamaño de la ventana. El tamaño
mínimo de "tracking" es la ventana más pequeña que se puede producir usando los
bordes para cambiar el tamaño de la ventana.
Descripción:
cchTextMax: valor de wParam. Especifica el número máximo de caracteres a
copiar, incluyendo el carácter nulo terminador de cadena.
Valor de retorno:
El valor de retorno es el número de caracteres copiados.
Observaciones:
Para un control edit, el texto a copiar es el contenido del control edit. Para un
combo box, el texto es el contenido de la porción control edit del combo box. Para
un button, el texto es el nombre del botón. Para otras ventanas, el texto es el título
de la ventana. Para copiar el texto de un ítem de un list box, debe usarse el mensaje
LB_GETTEXT.
Descripción:
Este mensaje no tiene parámetros
Valor de retorno:
El valor de retorlo en la longitud de la cadena, en caracteres, excluyendo el
terminador nulo.
Observaciones:
Para un control edit, el texto a copiar es el contenido del control edit. Para un
combo box, el texto es el contenido del control edit (o del control static) asociado
al combo box. Par un button, el texto es el nombre del button. Para otras ventabas,
es el título de la ventana. Para determinar la longitud de un ítem en un list box, se
puede usar el mensaje LB_GETTEXTLEN.
Descripción:
nScrollCode: valor de la palabra de menor peso de wParam. Especifica un valor
de scrollbar que indica una petición de desplazamiento del usuario. Este parámetro
puede tomar uno de los siguientes valores:
Valor Significado
SB_BOTTOM Desplazamiento total a la derecha.
SB_ENDSCROLL Termina el desplazamiento.
SB_LINELEFT Desplaza a la izquierda una unidad.
SB_LINERIGHT Desplaza a la derecha una unidad.
SB_PAGELEFT Desplaza a la izquierda en el ancho de la ventana.
SB_PAGERIGHT Desplaza a la derecha en el ancho de la ventana.
Desplaza a una posición absoluta. La posición actual se
SB_THUMBPOSITION
especifica mediante el parámetro nPos.
Arrastra la caja de desplazamiento a la posición especificada.
SB_THUMBTRACK
La posición actual se especifica mediante el parámetro nPos.
SB_TOP Desplazamiento total a la izquierda.
Valor de retorno:
Observaciones:
El mensaje de notificación SB_THUMBTRACK se usa normalmente por
aplicaciones que proporcionan una respuesta miestras el usuario arrastra la caja de
desplazamiento.
Descripción:
hwndFocus: valor de wParam. Identifica el control que recibe el foco del teclado
por defecto. Windows asigna el foco de teclado por defecto sólo si el
procedimiento de ventana retorna con TRUE.
Valor de retorno:
El procedimiento de diálogo retorna con TRUE para indicar a Windows que debe
asignar el foco del teclado al control dado por hwndFocus. En otro caso debe
retornar FALSE para evitar que Windows asigne el foco de teclado por defecto.
Comentarios:
El control que recibe el foco de teclado por defecto es siempre el primer control del
diálogo que es visible, no esta desactivado y tiene el estilo WS_TABSTOP.
Entonces el procedimiento de diálogo retorna TRUE, y Windows comprueba el
control para asegurarse de que el procedimiento no lo ha desactivado. Si ha sido
desactivado, Windows asigna el foco del teclado al siguiente control que es visible,
no está desactivado y tiene el estilo WS_TABSTOP.
Una aplicación puede volver con FALSE sólo si ha asignado el foco del teclado a
uno de los controles del cuadro de diálogo.
Descripción:
nVirtKey: valor del parámetro wParam. Indica el código de la tecla virtual no de
sistema.
Valor Descripción
Indica el contador de repetición. El valor es el número de
0—
veces que se repite una tecla como resultado de haber
15
dejado pulsada una tecla.
16— Indica el código de barrido. Depende del fabricante y
23 modelo del equipo.
Indica si la tecla es una tecla extendida, como la tecla
derecha de ALT and CTRL que aparece en el teclado
24
mejorado de 101 o 102 teclas. El valor es uno si es una
tecla extendida y cero si no lo es.
25—
Reservado, no usar.
28
Indica el código de contexto. El valor es 1 si la tecla ALT
29 estaba pulsada mientras la tecla fue pulsada; en caso
contrario es 0.
Indica el estado previo de la tecla. El valor es 1 si la tecla
30 estaba pulsada antes de que fuera enviado el mensaje y 0
si no lo estaba.
Indica el estado de transición. El valor es 1 si la tecla fue
31
liberada o 0 si permacece pulsada.
Valor de retorno:
Observaciones:
Puesto que no es necesario que exista una correspondencia uno a uno entre las
teclas pulsadas y los mensaje de carácter generados, la información en la palabra
alta del parámetro lKeyData normalmente no es útil para las aplicaciones. Esta
información se aplica sólo al mensaje WM_KEYDOWN que precede al mensaje
WM_CHAR más recientemente enviado.
Para teclados mejorados de 101 y 102 teclas, las teclas extendidas son el ALT y el
CTRL derechos en la sección principal del teclado y las teclas INS, DEL, HOME,
END, PAGE UP, PAGE DOWN y las teclas de flechas en el grupo de teclas a la
izquierda del teclado numérico; tambiém la tecla de dividir (/) y ENTER del
teclado numérico. Algunos otros teclados pueden soportar el bit de tecla extendida
en el parámetro lKeyData.
Descripción:
nVirtKey: valor del parámetro wParam. Indica el código de la tecla virtual no de
sistema.
Valor Descripción
Indica el contador de repetición. El valor es el número de
0—
veces que se repite una tecla como resultado de haber
15
dejado pulsada una tecla.
16— Indica el código de barrido. Depende del fabricante y
23 modelo del equipo.
Indica si la tecla es una tecla extendida, como la tecla
derecha de ALT y CTRL que aparece en el teclado
24
mejorado de 101 o 102 teclas. El valor es uno si es una
tecla extendida y cero si no lo es.
25—
Reservado, no usar.
28
Indica el código de contexto. El valor es 1 si la tecla ALT
29 estaba pulsada mientras la tecla fue pulsada; en caso
contrario es 0.
Indica el estado previo de la tecla. El valor es 1 si la tecla
30 estaba pulsada antes de que fuera enviado el mensaje y 0
si no lo estaba.
Indica el estado de transición. El valor es 1 si la tecla fue
31
liberada o 0 si permanece pulsada.
Observaciones:
Para teclados mejorados de 101 y 102 teclas, las teclas extendidas son el ALT y el
CTRL derechos en la sección principal del teclado y las teclas INS, DEL, HOME,
END, PAGE UP, PAGE DOWN y las teclas de flechas en el grupo de teclas a la
izquierda del teclado numérico; tambiém la tecla de dividir (/) y ENTER del
teclado numérico. Algunos otros teclados pueden soportar el bit de tecla extendida
en el parámetro lKeyData.
Descripción:
lpcs: valor del parámetro wParam. Apunta a una estructura CREATESTRUCT
para la ventana.
Valor de retorno:
Si una aplicación procesa este mensaje debe retornar con TRUE para que continue
la creación de la ventana. Si la aplicación retorna con FALSE, las funciones
CreateWindow o CreateWindowEx retornarán con un manipulador NULL.
Descripción:
hrgn: valor de wParam. Identifica la región de la ventana a actualizar. La región es
enmascarada al marco de la ventana.
Valor de retorno:
Una aplicación debe retornar con cero si procesa este mensaje.
Observaciones:
Una aplicación puede interceptar este mensaje y pintar su propio a medida marco.
La región enmascarada para una ventana es siempre rectangular, aunque la forma
del marco sea modificada.
Descripción:
Este mensaje no tiene parámetros.
Valor de retorno:
Una aplicación debe retornar con cero si procesa este mensaje.
Observaciones:
El sistema envía este mensaje cuando no hay ningún otro mensaje en la cola de la
aplicación. DispatchMessage determina a dónde enviar el mensaje; GetMessage
determina el mensaje a procesar. GetMessage vuelve con el mensaje WM_PAINT
cuando no hay otros mensajes en la cola de la aplicación, y DispatchMessage envía
el mensaje al procedimiento de ventana adecuado.
Descripción:
nExitCode: valor de wParam. Indica el código de salida suministrado en la
función PostQuitMessage.
Valor de retorno:
Este mensaje no tiene valor de retorno, ya que hace que el bucle de mensajes
termine antes de que el mensaje sea enviado al procedimiento de ventana de la
aplicación.
Descripción:
lpsz: valor de lParam. Puntero a una cadena terminada en cero que contiene el
texto de la ventana.
Valor de retorno:
El valor de retorno es TRUE si el texto se cambia. Es FALSE (para un control
edit), LB_ERRSPACE (para un list box) o CB_ERRSPACE (oara un combo box)
si no hay suficiente espacio disponible para colocar el texto en el control. Es
CB_ERR si el mensaje se envía a un combo box sin control edit.
Observaciones:
Para un control edit, el texto es el contenido el control edit. Para un combo box, el
texto es el contenido de la porción control edit del combo box. Para un button, el
texto es el nombre del botón. Para otras ventanas, el texto es el título de la ventana.
Este mensaje no cambia la selección actual en un list box o en un combo box. Una
aplicación debe usar el mensaje CB_SELECTSTRING para seleccionar el item en
un list box que coincida con el texto en el control edit.
Descripción:
chCharCode: valor de wParam. Especifica el código tecla de menú del sistema.
Valor Descripción
Indica el contador de repetición. El valor es el número de
0—
veces que se repite una tecla como resultado de haber
15
dejado pulsada una tecla.
16— Indica el código de barrido. Depende del fabricante y
23 modelo del equipo.
Indica si la tecla es una tecla extendida, como la tecla
derecha de ALT and CTRL que aparece en el teclado
24
mejorado de 101 o 102 teclas. El valor es uno si es una
tecla extendida y cero si no lo es.
25—
Reservado, no usar.
28
Indica el código de contexto. El valor es 1 si la tecla ALT
29 estaba pulsada mientras la tecla fue pulsada; en caso
contrario es 0.
Indica el estado previo de la tecla. El valor es 1 si la tecla
30 estaba pulsada antes de que fuera enviado el mensaje y 0
si no lo estaba.
Indica el estado de transición. El valor es 1 si la tecla fue
31
liberada o 0 si permacece pulsada.
Valor de retorno:
Observaciones:
Cuando el código de contexto es cero, el mensaje pudo ser pasado por la función
TranslateAccelerator, la cual lo manejará como si se tratara de un mensaje de tecla
estándar en lugar de un mensaje de tecla de sistema. Esto permite usar las teclas de
acelerador por la ventana activa aunque no tenga el foco del teclado.
Para teclados mejorados de 101 y 102 teclas, las teclas extendidas son el ALT y el
CTRL derechos en la sección principal del teclado y las teclas INS, DEL, HOME,
END, PAGE UP, PAGE DOWN y las teclas de flechas en el grupo de teclas a la
izquierda del teclado numérico; tambiém la tecla de dividir (/) y ENTER del
teclado numérico. Algunos otros teclados pueden soportar el bit de tecla extendida
en el parámetro lKeyData.
Una ventana recive este mensaje cuando el usuario elige un comando desde el
menú de sistema (también conocido como menú de control) o cuando el usuario
pulsa el botón de maximizar o minimizar.
Descripción:
uCmdType: indica el tipo de comando de sistema pedido. Puese ser uno de los
siguientes valores:
Valor Significado
SC_CLOSE Cierra la ventana.
Cambia el cursor al signo de
interrogación con un puntero. Si el
SC_CONTEXTHELP usuario hace click en un control en el
cuadro de diálogo, el control recibirá un
mensaje WM_HELP.
Selecciona el elemento por defecto; el
SC_DEFAULT usuarui hizo doble click en el menú de
sistema.
Activa la ventana asociada con la
acción especificada en el "hot key". La
SC_HOTKEY
palabra de menor peso del parámetro
lParam identifica la ventaa a activar.
Desplaza el contenido de la ventana
SC_HSCROLL
horizontalmente.
Recupera el menú del sistema como
SC_KEYMENU
resultado de la pulsación de una tecla.
SC_MAXIMIZE
Maximiza la ventana.
(o SC_ZOOM)
SC_MINIMIZE
Minimiza la ventana.
(o SC_ICON)
Sólo para Windows 95: ajusta el estado
SC_MONITORPOWER
del monitor. Este comando soporta
Valor de retorno:
Una aplicación que procese este mensaje debe retornar con cero.
Observaciones:
La función DefWindowProc ejecuta las acciones predefinidas de las peticiones del
menú del sistema de la tabla anterior.
Los elementos del menú de sistema pueden ser modificados usando las funciones
GetSystemMenu, AppendMenu, InsertMenu, ModifyMenu, InsertMenuItem y
Una aplicación puede llevar a cabo cualquier comando del sistema en cualquier
momento pasando un mensaje WM_SYSCOMMAND a la función
DefWindowProc. Caulquier mensaje WM_SYSCOMMAND no manipulado por la
aplicación debe ser pasado a la función DefWindowProc. Cualquier comando
nuevo añadido por la aplicación debe ser procesado por ella y nunca debe ser
pasado a la función DefWindowProc.
Las teclas de aceleración que están definidas para elegir elementos del menú del
sistema son traducidas a mensajes WM_SYSCOMMAND; el resto de las teclas de
aceleración se traducen a mensajes WM_COMMAND.
Descripción:
chCharCode: valor de wParam. Especifica el código de carácter generado por la
tecla muerta.
Valor Descripción
Indica el contador de repetición. El valor es el número de
0—
veces que se repite una tecla como resultado de haber
15
dejado pulsada una tecla.
16— Indica el código de barrido. Depende del fabricante y
23 modelo del equipo.
Indica si la tecla es una tecla extendida, como la tecla
derecha de ALT and CTRL que aparece en el teclado
24
mejorado de 101 o 102 teclas. El valor es uno si es una
tecla extendida y cero si no lo es.
25—
Reservado, no usar.
28
Indica el código de contexto. El valor es 1 si la tecla ALT
29 estaba pulsada mientras la tecla fue pulsada; en caso
contrario es 0.
Indica el estado previo de la tecla. El valor es 1 si la tecla
30 estaba pulsada antes de que fuera enviado el mensaje y 0
si no lo estaba.
Valor de retorno:
La aplicación debe retornar cero si proceso este mensaje.
Observaciones:
El mensaje WM_SYSDEADCHAR se usa normalmente por aplicaciones que
informan al usuario sobre cada tecla pulsada. Por ejemplo, una aplicación qiue
pueda mostrar el acento en la posición actual del cursor sun over el caret.
Puesto que no es necesario que exista una correspondencia uno a uno entre las
teclas pulsadas y los mensaje de carácter generados, la información en la palabra
alta del parámetro lKeyData normalmente no es útil para las aplicaciones. Esta
información se aplica sólo al mensaje WM_KEYDOWN que precede al mensaje
WM_CHAR más recientemente enviado.
Para teclados mejorados de 101 y 102 teclas, las teclas extendidas son el ALT y el
CTRL derechos en la sección principal del teclado y las teclas INS, DEL, HOME,
END, PAGE UP, PAGE DOWN y las teclas de flechas en el grupo de teclas a la
izquierda del teclado numérico; tambiém la tecla de dividir (/) y ENTER del
teclado numérico. Algunos otros teclados pueden soportar el bit de tecla extendida
en el parámetro lKeyData.
Descripción:
nVirtKey: valor del parámetro wParam. Indica el código de la tecla virtual
pulsada.
Valor Descripción
Indica el contador de repetición. El valor es el número de
0—
veces que se repite una tecla como resultado de haber
15
dejado pulsada una tecla.
16— Indica el código de barrido. Depende del fabricante y
23 modelo del equipo.
Indica si la tecla es una tecla extendida, como la tecla
derecha de ALT and CTRL que aparece en el teclado
24
mejorado de 101 o 102 teclas. El valor es uno si es una
tecla extendida y cero si no lo es.
25—
Reservado, no usar.
28
Indica el código de contexto. El valor es 1 si la tecla ALT
29 estaba pulsada mientras la tecla fue pulsada; en caso
contrario es 0.
Indica el estado previo de la tecla. El valor es 1 si la tecla
30 estaba pulsada antes de que fuera enviado el mensaje y 0
si no lo estaba.
31 Indica el estado de transición. El valor es 1 si la tecla fue
Valor de retorno:
La aplicación debe retornar cero si procesó este mensaje.
Observaciones:
Cuando un código de contexto es cero, el mensaje puede ser pasado a la función
TranslateAccelerator, que lo manejará como si fuera un mensaje normal de tecla en
lugar de un mensaje de carácter de sistema. Esto permite usar aceleradores de
teclado con la ventana activa aunque no tenga el foco del teclado.
Para teclados mejorados de 101 y 102 teclas, las teclas extendidas son el ALT y el
CTRL derechos en la sección principal del teclado y las teclas INS, DEL, HOME,
END, PAGE UP, PAGE DOWN y las teclas de flechas en el grupo de teclas a la
izquierda del teclado numérico; tambiém la tecla de dividir (/) y ENTER del
teclado numérico. Algunos otros teclados pueden soportar el bit de tecla extendida
en el parámetro lKeyData.
Descripción:
nVirtKey: valor del parámetro wParam. Indica el código de la tecla virtual
liberada.
Valor Descripción
Indica el contador de repetición. El valor es el número de
0—
veces que se repite una tecla como resultado de haber
15
dejado pulsada una tecla.
16— Indica el código de barrido. Depende del fabricante y
23 modelo del equipo.
Indica si la tecla es una tecla extendida, como la tecla
derecha de ALT and CTRL que aparece en el teclado
24
mejorado de 101 o 102 teclas. El valor es uno si es una
tecla extendida y cero si no lo es.
25—
Reservado, no usar.
28
Indica el código de contexto. El valor es 1 si la tecla ALT
29 estaba pulsada mientras la tecla fue pulsada; en caso
contrario es 0.
Indica el estado previo de la tecla. El valor es 1 si la tecla
30 estaba pulsada antes de que fuera enviado el mensaje y 0
si no lo estaba.
31 Indica el estado de transición. El valor es 1 si la tecla fue
Valor de retorno:
La aplicación debe retornar cero si procesó este mensaje.
Observaciones:
Cuando un código de contexto es cero, el mensaje puede ser pasado a la función
TranslateAccelerator, que lo manejará como si fuera un mensaje normal de tecla en
lugar de un mensaje de carácter de sistema. Esto permite usar aceleradores de
teclado con la ventana activa aunque no tenga el foco del teclado.
Para teclados mejorados de 101 y 102 teclas, las teclas extendidas son el ALT y el
CTRL derechos en la sección principal del teclado y las teclas INS, DEL, HOME,
END, PAGE UP, PAGE DOWN y las teclas de flechas en el grupo de teclas a la
izquierda del teclado numérico; tambiém la tecla de dividir (/) y ENTER del
teclado numérico. Algunos otros teclados pueden soportar el bit de tecla extendida
en el parámetro lKeyData.
Para teclados mejorados de 102 teclas no U.S., la tecla ALT derecha es manejada
nomo un CTRL+ALT. La siguiente tabla muestra la secuencia de mensajes que
resultan cuando el usuario presiona y librera esta tecla:
Descripción:
wTimerID: valor del parámetro wParam. Especifica el identificador del timer o
cronómetro.
Valor de retorno:
Una aplicación que procese este mensaje debe retornar con cero.
Observaciones:
La función DispatchMessage vuelve a enviar este mensaje si no hay otros mensajes
en la cola de mensajes del procesos.
Descripción:
nScrollCode: valor de la palabra de menor peso de wParam. Especifica un valor
de scrollbar que indica una petición de desplazamiento del usuario. Este parámetro
puede tomar uno de los siguientes valores:
Valor Significado
SB_BOTTOM Desplazamiento total hacia abajo.
SB_ENDSCROLL Termina el desplazamiento.
SB_LINEUP Desplaza hacia arriba una unidad.
SB_LINEDOWN Desplaza hacia abajo una unidad.
SB_PAGEUP Desplaza hacia arriba en la altura de la ventana.
SB_PAGEDOWN Desplaza hacia abajo en la altura de la ventana.
Desplaza a una posición absoluta. La posición actual se
SB_THUMBPOSITION
especifica mediante el parámetro nPos.
Arrastra la caja de desplazamiento a la posición especificada.
SB_THUMBTRACK
La posición actual se especifica mediante el parámetro nPos.
SB_TOP Desplazamiento total hacia arriba.
Valor de retorno:
Observaciones:
El mensaje de notificación SB_THUMBTRACK se usa normalmente por
aplicaciones que proporcionan una respuesta miestras el usuario arrastra la caja de
desplazamiento.
Atributos de carga
Los atributos de carga indican cuando debe ser cargado el recurso. Este parámetro
debe ser uno de los siguientes:
Atributos de memoria
Los atributos de memoria especifican si el recurso es fijo o puede cambiar de
posición en memoria, también si es descartable o puro. El parámetro de memoria
puede ser uno o más de los siguientes:
Parametro:
textocaption: especifica una cadena de caracteres entre comillas dobles.
Parametro:
dword: un valor de doble palabra definido por el usuario.
Parámetros:
class: especifica un entero sin signo de 16 bits o una cadena entre comillas dobles,
que identifica la clase del cuadro de diálogo. Si el procedimiento de ventana para la
clase no procesa un mensaje enviado a él, debe llamar a la función DefDlgProc
para asegurar que todos los mensajes son manipulados apropiadamente por el
diálogo. Una clase privada puede usar DefDlgProc como procedimiento de ventana
por defecto. La clase debe ser registrada con el valor DLGWINDOWEXTRA para
el miembro cbWndExtra de la estructura WNDCLASS.
Observaciones:
La sentencia CLASS sólo debe ser usada en casos especiales, puesto que pasa por
encima del proceso normal del cuadro de diálogo. La sentencia CLASS convierte
un cuadro de diálogo en una ventana de la clase especificada; dependiendo de la
clase, esto puede dar resultados no deseados. No uses nombres de clases de
controles redefinidos con esta sentencia.
Parámetros:
text: especifica el texto que se muestra junto con el control. El texto es colocado en
el interior de las dimensiones especificadas para el control o junto al control.
Este parámetro contiene cero o más caracteres encerrados entre comillas dobles.
Las cadenas se terminan automáticamente con cero y se convierten a Unicode en el
fichero de recursos resultante, excepto para cadenas especificadas en sentencias de
datos sin formato. (Los datos sin formato se pueden incluir bajo la sentencia
RCDATA y recursos definidos por el usuario.) Para especificar una cadena
Unicode en datos sin formato, hay que especificar explícitamente que la cadena es
"wide-character" usando el prefijo L.
Por defecto, los caracteres entre comillas dobles son caracteres ANSI y las
sentencias de escape son interpretadas como secuencias de escape de un byte. Si la
cadena está precedida con el prefijo L, la cedan se considera como cadena "wide-
character" y las secuencias de escape se interpretan como secuencias de escape de
dos bytes que especifican los caracteres Unicode. Si el texto debe incluir comillas
dobles, se deben escribir las comillas dobles dos veces o usar la secuencia de
escape \".
id: especifica el identificador del control. Debe ser un valor de entero sin signo de
16 bits dentro del rango entre 0 y 65535 o una expresión aritmética que se avalúe
en ese rango.
y: especifica la coordenada y del lado superior del control, relativo al lado superior
del diálogo. Debe ser un valor entero sin signo de 16 bits entre 0 y 65535. La
coordenada se expresa en unidades de diálogo y es relativa al origen del cuadro de
diálogo, ventana o control que contenga al control especificado.
width: especifica la anchura del control. Este valor es un entero sin signo de 16
bits entre 1 y 65535. La anchura se expresa en cuartos de unidades de carácter.
height: especifica la altura del control. Este valor es un entero sin signo de 16 bits
entre 1 y 65535. La altura se expresa en octavos de unidades de carácter.
Un botón puede tener sólo uno de los siguientes estilos, con la excepción de
BS_LEFTTEXTBS, el cual puede ser combinado con "check boxes" y "radio
buttons".
Para ver los estilos disponibles para button consultar estilos button.
Para ver los estilos disponibles para combobox consultar estilos combobox.
Para ver los estilos disponibles para edit consultar estilos edit.
Para ver los estilos disponibles para listbox consultar estilos listbox.
Para ver los estilos disponibles para scrollbar consultar estilos scrollbar.
Para ver los estilos disponibles para static consultar estilos static.
Definición:
nameID DIALOG [load-mem] x, y, ancho, alto
[sentencias-opcionales]
BEGIN
sentencias de controles
. . .
END
Descripción:
nameID: identifica el cuadro de diálogo. Puede ser un nombre único o un valor
entero de 16 bits único entre 1 y 65535.
load-mem: indica el tipo de carga y atributos de memoria del recurso. Para más
información ver "Atributos Comunes de Recursos".
Para más información sobre los parámetros x, y, ancho y alto, ver "Parámetros
Comunes de Sentencias".
Observaciones:
La función GetDialogBaseUnits devuelve las unidades base del diálogo en pixels.
El significado exacto de las coordenadas depende del estilo definido en la sentencia
opcional STYLE. Para cuadros de diálofo child-style, las coordenadas son relativas
al origen de la ventana padre, a no ser que el diálogo tenga el estilo
DS_ABSALIGN; en ese caso, las coordenadas son relativas al origen de la
pantalla.
El nombre DIALOG puede ser usado también como parámetro de nombre de clase
en la función CreateWindow para crear una ventana con los atributos de un cuadro
de diálogo.
Parametros:
extended-style: el estilo WS_EX_style para el cuadro de diálogo o para el control.
Parámetros:
language: identificador de lenguaje. Debe ser una de las constantes definidas en
WINNLS.H
Definición:
menuID MENU [load-mem]
[sentencias-opcionales]
BEGIN
definiciones_de_item
. . .
END
Descripción:
menuID: identifica el menú. Puede ser un nombre único o un valor entero sin
signo de 16 bits único entre 1 y 65535.
load-mem: indica el tipo de carga y atributos de memoria del recurso. Para más
información ver "Atributos Comunes de Recursos".
Parámetros:
texto: especifica el nombre del ítem de menú. La cadena puede contener las
secuencias de escape \t y \a. El carácter \t inserta un tabulador en la cadena y se usa
para alinear el texto en columnas. Los caracteres tab debes ser usados sólo en
menús pop-up, nunca en barras de menú. (Para información sobre menús pop-up,
ver la sentencia POPUP). El carácter \a alinea todo el texto que le sigue al borde
derecho de la barra de menú o del menú pop-up.
Esta forma sólo sirve para los controles comunes, pero existe una forma más
general para definir todo tipo de controles, que es la que usaremos normalmente.
Se trata de los controles generales.
Parámetros:
control: palabra clave que indica el tipo de control que se está definiendo, como
PUSHBUTTON o CHECKBOX.
text: especifica el texto que se muestra junto con el control. El texto es colocado en
el interior de las dimensiones especificadas para el control o junto al control.
Este parámetro contiene cero o más caracteres encerrados entre comillas dobles.
Las cadenas se terminan automáticamente con cero y se convierten a Unicode en el
fichero de recursos resultante, excepto para cadenas especificadas en sentencias de
datos sin formato. (Los datos sin formato se pueden incluir bajo la sentencia
RCDATA y recursos definidos por el usuario.) Para especificar una cadena
Unicode en datos sin formato, hay que especificar explícitamente que la cadena es
"wide-character" usando el prefijo L.
Por defecto, los caracteres entre comillas dobles son caracteres ANSI y las
sentencias de escape son interpretadas como secuencias de escape de un byte. Si la
cadena está precedida con el prefijo L, la cedan se considera como cadena "wide-
id: especifica el identificador del control. Debe ser un valor de entero sin signo de
16 bits dentro del rango entre 0 y 65535 o una expresión aritmética que se avalúe
en ese rango.
y: especifica la coordenada y del lado superior del control, relativo al lado superior
del diálogo. Debe ser un valor entero sin signo de 16 bits entre 0 y 65535. La
coordenada se expresa en unidades de diálogo y es relativa al origen del cuadro de
diálogo, ventana o control que contenga al control especificado.
width: especifica la anchura del control. Este valor es un entero sin signo de 16
bits entre 1 y 65535. La anchura se expresa en cuartos de unidades de carácter.
height: especifica la altura del control. Este valor es un entero sin signo de 16 bits
entre 1 y 65535. La altura se expresa en octavos de unidades de carácter.
style: especifica los estilos del control. Usar el operador de bits OR (|) para
combinar estilos.
Parámetros:
texto: especifica el nombre del menú pop-up. Esta cadna debe estar entre comillas
dobles.
Parámetro:
style: especifica el estilo de ventana. Este parámetro puede ser un valor entero o un
nombre redefinido. A continuación se muestra una lista de los estilos redefinidos:
Estilo Definición
Indica que los controles edit en el cuadro de
diálogo usarán memoria de la sección de
datos de la aplicación. Por defecto, todos los
controles edit de los cuadros de diálogo usan
memoria fuera de la sección de datos de la
aplicación. Esta característica puede
suprimirse añadiendo el flag
DS_LOCALEDIT DS_LOCALEDIT al comando STYLE del
cuadro de diálogo. Si no se usa este flag, los
mensajes EM_GETHANDLE y
EM_SETHANDLE no deben ser usados ya
que el almacenamiento para el control no
estará en la sección de datos de la aplicación.
Esta característica no afecta a los controles
edit creados fuera de los cuadros de diálogo.
Crea un cuadro de diálogo con un border de
diálogo modal que puede ser combinado con
DS_MODALFRAME una barra de título y un menú de sistema
especificando los estilos WS_CAPTION y
WS_SYSMENU.
Suprime los mensajes WM_ENTERIDLE que
DS_NOIDLEMSG Windows enviaría a la ventana propietaria del
diálogo mientras éste es mostrado.
DS_SYSMODAL Crea un cuadro de diálogo system-modal.
WS_BORDER Crea una que tiene de borde una línea fina.
Crea una ventana con una barra de título,
WS_CAPTION
(incluye el estilo WS_BORDER).
Crea una ventana hija. Este estilo no puede
WS_CHILD
ser usado junto con el estilo WS_POPUP.
WS_CHILDWINDOW Lo mismo que WS_CHILD.
Comentarios:
Si se usan los nombre redefinidos, se debe incluir el fichero de cabecera
WINDOWS.H.
Parámetro:
dword: un valor de doble palabra definido por el usuario.
OWL y MFC
También existen librerías de clases para programar en Windows, las más conocidas
son OWL (Object Windows Library) de Borland y MFC (Microsoft Foundation
Class) de Microsoft. Aquí no las usaremos, pero para algunos elementos de uso
frecuente probablemente diseñaremos nuestras propias clases, y probablemente
construyamos una librería con ellas.