Compartir vía


Mensajes de botón

Un botón puede enviar mensajes a su ventana primaria y una ventana primaria puede enviar mensajes a un botón.

En esta sección se tratan los temas siguientes.

Enviar mensajes a botones

Una ventana primaria puede enviar mensajes a un botón en una ventana superpuesta o secundaria mediante la función SendMessage , o bien puede enviar mensajes a un botón en un cuadro de diálogo mediante las funciones SendDlgItemMessage, CheckDlgButton, CheckRadioButton e IsDlgButtonChecked .

Una aplicación puede usar el mensaje BM_GETCHECK para recuperar el estado de verificación de una casilla o un botón de radio. Una aplicación también puede usar el mensaje BM_GETSTATE para recuperar los estados actuales del botón (estado de comprobación, estado de inserción y estado de foco). Para obtener información sobre un estado específico, use una máscara de bits en el valor de estado devuelto.

El mensaje de BM_SETCHECK establece el estado de verificación de una casilla o un botón de radio; el mensaje devuelve cero. El BM_SETSTATE mensaje establece el estado de inserción de un botón; este mensaje también devuelve cero. El BM_SETSTYLE mensaje cambia el estilo de un botón. Está diseñado para cambiar los estilos de botón dentro de un tipo (por ejemplo, cambiar una casilla a una casilla automática). No está diseñado para cambiar entre tipos (por ejemplo, cambiar una casilla a un botón de radio). Una aplicación no debe cambiar un botón de un tipo a otro.

Un botón del estilo BS_BITMAP o BS_ICON muestra un mapa de bits o un icono en lugar de texto. El mensaje BM_SETIMAGE asocia un identificador a un mapa de bits o icono con un botón. El mensaje BM_GETIMAGE recupera un identificador del mapa de bits o icono asociado a un botón.

Una aplicación también puede usar el mensaje DM_GETDEFID para recuperar el identificador del control de botón de inserción predeterminado en un cuadro de diálogo. Una aplicación puede usar el mensaje DM_SETDEFID para establecer el botón de inserción predeterminado para un cuadro de diálogo.

Llamar a la función CheckDlgButton o CheckRadioButton equivale a enviar un mensaje de BM_SETCHECK . Llamar a la función IsDlgButtonChecked equivale a enviar un mensaje de BM_GETCHECK .

Control de mensajes desde un botón

Las notificaciones de un botón se envían como mensajes WM_COMMAND o WM_NOTIFY . Puede encontrar información sobre qué mensaje se usa en la página de referencia de cada notificación.

Para obtener más información sobre cómo controlar los mensajes, vea Control Messages. Consulte también Mensajes de botón.

Mensajes de notificación de botones

Cuando el usuario hace clic en un botón, su estado cambia y el botón envía códigos de notificación, en forma de WM_COMMAND mensajes, a su ventana primaria. Por ejemplo, un control de botón de inserción envía el código de notificación BN_CLICKED cada vez que el usuario elige el botón. En todos los casos (excepto por BCN_HOTITEMCHANGE), la palabra de orden bajo del parámetro wParam contiene el identificador de control, la palabra de orden superior de wParam contiene el código de notificación y el parámetro lParam contiene el identificador de la ventana de control.

Tanto el mensaje como la respuesta de la ventana primaria dependen del tipo, estilo y estado actual del botón. A continuación se muestran los códigos de notificación de botón que una aplicación debe supervisar y procesar.

Código de notificación Descripción
BCN_HOTITEMCHANGE El mouse entró o dejó el área de cliente de un botón.
BN_CLICKED El usuario ha clic en un botón.
BN_DBLCLK o BN_DOUBLECLICKED El usuario ha doble clic en un botón.
BN_DISABLE Un botón está deshabilitado.
BN_PUSHED o BN_HILITE El usuario ha presionado un botón.
BN_KILLFOCUS El botón perdió el foco del teclado.
BN_PAINT El botón debe pintarse.
BN_SETFOCUS El botón ganó el foco del teclado.
BN_UNPUSHED o BN_UNHILITE El botón ya no se inserta.

 

Un botón envía los códigos de notificación BN_DISABLE, BN_PUSHED, BN_KILLFOCUS, BN_PAINT, BN_SETFOCUS y BN_UNPUSHED solo si tiene el estilo BS_NOTIFY . BN_DBLCLK códigos de notificación se envían automáticamente para los botones de BS_USERBUTTON, BS_RADIOBUTTON y BS_OWNERDRAW . Otros tipos de botón envían BN_DBLCLK solo si tienen el estilo BS_NOTIFY . Todos los botones envían el código de notificación BN_CLICKED independientemente de sus estilos de botón.

En el caso de los botones automáticos, el sistema cambia el estado de inserción y pinta el botón. En este caso, la aplicación normalmente procesa solo los códigos de notificación BN_CLICKED y BN_DBLCLK . En el caso de los botones que no son automáticos, la aplicación suele responder al código de notificación mediante el envío de un mensaje para cambiar el estado del botón. Para obtener información sobre cómo enviar mensajes a botones, vea Enviar mensajes a botones.

Cuando el usuario selecciona un botón dibujado por el propietario, el botón envía a su ventana primaria un mensaje de WM_DRAWITEM que contiene el identificador del control que se va a dibujar e información sobre sus dimensiones y estado.

Mensajes de color de botón

El sistema proporciona valores de color predeterminados para los botones. Una aplicación puede recuperar los valores predeterminados de estos colores llamando a la función GetSysColor o estableciendo los valores llamando a la función SetSysColors . En la tabla siguiente se muestran los valores predeterminados de color de botón.

Valor Elemento coloreado
COLOR_BTNFACE Caras de botón.
COLOR_BTNHIGHLIGHT Resalte el área (los bordes superior e izquierdo) de un botón.
COLOR_BTNSHADOW Área de sombra (los bordes inferior y derecho) de un botón.
COLOR_BTNTEXT Texto normal (nograyed) en botones.
COLOR_GRAYTEXT Texto deshabilitado (gris) en botones. Este color se establece en 0 si el controlador de pantalla actual no admite un color gris sólido.
COLOR_WINDOW Fondos de ventana.
COLOR_WINDOWFRAME Marcos de ventana.
COLOR_WINDOWTEXT Texto en ventanas.

 

Sin embargo, llamar a SetSysColors afecta a todas las aplicaciones, por lo que no debe llamar a esta función para personalizar los botones de la aplicación.

El sistema envía un mensaje de WM_CTLCOLORBTN a la ventana primaria de un botón antes de dibujar un botón. Este mensaje contiene un identificador para el contexto del dispositivo del botón y un identificador para la ventana secundaria. La ventana primaria puede usar estos identificadores para cambiar los colores de fondo y texto del botón. Sin embargo, solo los botones dibujados por el propietario responden a la ventana primaria que procesa el mensaje.

Procesamiento de mensajes predeterminado del botón

El procedimiento de ventana de la clase de ventana de control de botón predefinido lleva a cabo el procesamiento predeterminado de todos los mensajes que el procedimiento de control de botón no procesa. Cuando el procedimiento de control de botón devuelve FALSE para cualquier mensaje, el procedimiento de ventana predefinido comprueba los mensajes y realiza las acciones predeterminadas enumeradas en la tabla siguiente.

Message Acción predeterminada
BM_CLICK Envía el botón un WM_LBUTTONDOWN y un mensaje de WM_LBUTTONUP y envía a la ventana primaria un código de notificación BN_CLICKED .
BM_GETCHECK Devuelve el estado de comprobación del botón.
BM_GETIMAGE Devuelve un identificador al mapa de bits o icono asociado al botón o NULL si el botón no tiene ningún mapa de bits o icono.
BM_GETSTATE Devuelve el estado de comprobación actual, el estado de inserción y el estado de foco del botón.
BM_SETCHECK Establece el estado de comprobación para todos los estilos de botones de radio y casillas. Si el parámetro wParam es mayor que cero para los botones de radio, el botón recibe el estilo WS_TABSTOP .
BM_SETIMAGE Asocia el identificador de icono o mapa de bits especificado con el botón y devuelve un identificador al mapa de bits o icono anterior.
BM_SETSTATE Establece el estado de inserción del botón. En el caso de los botones dibujados por el propietario, se envía un mensaje WM_DRAWITEM a la ventana primaria si el estado del botón ha cambiado.
BM_SETSTYLE Establece el estilo del botón. Si la palabra de orden bajo del parámetro lParam es TRUE, se vuelve a dibujar el botón.
WM_CHAR Activa una casilla o casilla automática cuando el usuario presiona las teclas más (+) o iguales (=). Desactiva una casilla o casilla automática cuando el usuario presiona la tecla menos (–).
WM_ENABLE Pinta el botón.
WM_ERASEBKGND Borra el fondo de los botones dibujados por el propietario. Los fondos de otros botones se borran como parte del procesamiento de WM_PAINT y WM_ENABLE .
WM_GETDLGCODE Devuelve valores que indican el tipo de entrada procesado por el procedimiento de botón predeterminado, como se muestra en la tabla siguiente.
Estilo de botón Devoluciones
BS_AUTOCHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_AUTORADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON
BS_CHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_DEFPUSHBUTTON DLGC_DEFPUSHBUTTON | DLGC_BUTTON
BS_GROUPBOX DLGC_STATIC
BS_PUSHBUTTON DLGC_UNDEFPUSHBUTTON | DLGC_BUTTON
BS_RADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON

 

WM_GETFONT Devuelve un identificador a la fuente actual.
WM_KEYDOWN Presiona el botón si el usuario presiona la barra espaciadora.
WM_KEYUP Libera la captura del mouse para todos los casos excepto la tecla TAB.
WM_KILLFOCUS Quita el rectángulo de foco de un botón. En el caso de los botones de inserción y los botones de inserción predeterminados, el rectángulo de foco se invalida. Si el botón tiene la captura del mouse, se libera la captura, no se hace clic en el botón y se quita cualquier estado de inserción.
WM_LBUTTONDBLCLK Envía un código de notificación BN_DBLCLK a la ventana primaria para botones de radio y botones dibujados por el propietario. Para otros botones, se procesa un doble clic como un mensaje de WM_LBUTTONDOWN .
WM_LBUTTONDOWN Resalta el botón si la posición del cursor del mouse está dentro del rectángulo de cliente del botón.
WM_LBUTTONUP Libera la captura del mouse si el botón tenía la captura del mouse.
WM_MOUSEMOVE Realiza la misma acción que WM_LBUTTONDOWN, si el botón tiene la captura del mouse. De lo contrario, no se realiza ninguna acción.
WM_NCCREATE Convierte cualquier botón de BS_OWNERDRAW en un botón de BS_PUSHBUTTON .
WM_NCHITTEST Devuelve HTTRANSPARENT, si el control de botón es un cuadro de grupo.
WM_PAINT Dibuja el botón según su estilo y estado actual.
WM_SETFOCUS Dibuja un rectángulo de foco en el botón que obtiene el foco. Para los botones de radio y los botones de radio automáticos, la ventana primaria se envía un código de notificación BN_CLICKED .
WM_SETFONT Establece una nueva fuente y, opcionalmente, actualiza la ventana.
WM_SETTEXT Establece el texto del botón. En el caso de un cuadro de grupo, el mensaje pinta sobre el texto preexistente antes de volver a pintar el cuadro de grupo con el nuevo texto.
WM_SYSKEYUP Libera la captura del mouse para todos los casos excepto la tecla TAB.

 

El procedimiento de ventana predefinido pasa todos los demás mensajes a la función DefWindowProc para el procesamiento predeterminado.

Mensajes de control