Botones con iconos o mapas de bits

Existen dos estilos para los botones que nos permiten usar un gráfico, un icono o un mapa de bits, en lugar de un texto.

El estilo BS_ICON permite asignar un icono a un botón.

El estilo BS_BITMAP permite asignar un mapa de bits a un botón.

Estas asignaciones son independientementes de otros estilos que definan el tipo, es decir, se puede asignar un icono o un mapa de bits a un botón pulsable, a un check box o a un radio button.

Además de indicar el estilo al crear el control, o en la definición del recurso, es necesario asignar la imagen al botón. Para eso se usa el mensaje BM_SETIMAGE. En el parámetro wParam se indica el tipo de imagen, IMAGE_ICON para un icono o IMAGE_BITMAP para un mapa de bits. En el mensaje lParam pasaremos el manipulador de la imagen, que será de tipo HICON para un icono y de tipo HBITMAP para un mapa de bits.

Ejemplo de botón con un icono:

   HWND hctrl;
   HICON hIcono;
...
   hctrl = CreateWindowEx(
      0,
      "BUTTON",        /* Nombre de la clase */
      "icono",         /* Texto del título */
      BS_ICON | BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, /* Estilo */
      9, 49,           /* Posición */
      95, 24,          /* Tamaño */
      hwnd,            /* Ventana padre */
      (HMENU)ID_BOTON2, /* Identificador del control */
      hInstance,       /* Instancia */
      NULL);           /* Sin datos de creación de ventana */
   hIcono = LoadIcon(hInstance, "Icono");
   SendMessage(hctrl, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcono);

Un ejemplo de botón con un mapa de bits:

   HWND hctrl;
   HBITMAP hBitmap;
...
   hctrl = CreateWindowEx(
      0,
      "BUTTON",        /* Nombre de la clase */
      "Bitmap",        /* Texto del título */
      BS_BITMAP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, /* Estilo */
      9, 9,            /* Posición */
      87+4, 20+4,      /* Tamaño */
      hwnd,            /* Ventana padre */
      (HMENU)ID_BOTON1,/* Identificador del control */
      hInstance,       /* Instancia */
      NULL);           /* Sin datos de creación de ventana */ 
   hBitmap = LoadBitmap(hInstance,  "power");
   SendMessage(hctrl, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);

De forma simétrica, podemos usar el mensaje BM_GETIMAGE para obtener un manipulador del icono o mapa de bits asociado a un control botón. Indicaremos en el parámetro wParam el tipo de imagen a recuperar:

   HICON hIcono;
...
   hIcono = (HICON)SendMessage(hctrl, BM_GETIMAGE, IMAGE_ICON, 0);

Otros estilos para botones

Generalmente, nuestros botones tendrán el estilo BS_TEXT, que es el estilo por defecto y el que se usa si no se indican los estilos BS_ICON, BS_BITMAP o BS_OWNERDRAW.

El estilo BS_TEXT indica que se trata de un botón normal, con un texto que indica (o debería indicar) la acción del botón.

El estilo BS_MULTILINE es una variación de BS_TEXT, que permite fragmentar el texto en varias líneas diferentes, que se amoldan al espacio disponible del botón.

Alineación de contenidos

Hasta ahora sólo hemos mencionado el estilo BS_CENTER, que nos permitía situal el texto, icono o mapa de bits de un botón centrado horizontalmente.

Existen otros estilos que nos permiten situar el contenido en otros lugares. Tres de esos estilos permiten definir la alineación del texto en el sentido horizontal: BS_LEFT a la izquierda, BS_CENTER en el centro y BS_RIGHT a la derecha.

Otros tres estilos permiten definir la alineación en sentido vertical: BS_TOP en la parte superior, BS_VCENTER centrado verticalmente y BS_BOTTOM en la parte inferior.

Estos estilos se pueden combinar, eligiendo uno de cada grupo, de modo que podemos elegir nueve posiciones diferentes para situar el texto:

BS_LEFT | BS_TOP BS_CENTER | BS_TOP BS_RIGHT | BS_TOP
BS_LEFT | BS_VCENTER BS_CENTER | BS_VCENTER BS_RIGHT | BS_VCENTER
BS_LEFT | BS_BOTTOM BS_CENTER | BS_BOTTOM BS_RIGHT | BS_BOTTOM

Check box y Radio buttons

Por último, existen otros dos estilos, que son equivalentes: BS_LEFTTEXT y BS_RIGHTBUTTON, que permiten situar el gráfico de botones con estilos check box o radio buttons a la derecha, en lugar de situarlo a la izquierda, que es la posición por defecto.

Ejemplo 68


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 68 win068.zip 2007-03-15 4582 bytes 283

Comentarios de los usuarios (2)

JDC
2012-10-24 07:55:46

Hola otra vez una pequeña consulta en el ejemplo68 usan CreateFont para dar formato al texto de los controles usados, queria saber si para usar TextOut es mas recomendable la funcion CreateFont o es mejor usar la estructura LOGFONT, esto lo necesito para insertar un texto rotado cierto angulo, si usara LOGFONT tendria que usar ExTextOut ¿estoy en lo cierto?

Salu2

Steven R. Davidson
2012-10-28 05:27:48

Hola JDC,

No. Esto no es correcto. Las funciones 'TextOut()' y 'ExtTextOut()' usan la fuente seleccionada, el color de fondo seleccionado, y el color del texto seleccionado en el DC para mostrar texto en tal DC. Es irrelevante invocar 'CreateFont()' o 'CreateFontIndirect()' para crear la fuente, ya que se debe seleccionar la fuente. Estas funciones de la GDI simplemente usan la fuente seleccionada en el DC.

En cuanto a la rotación del texto mediante la rotación de la fuente, puedes elegir tanto 'CreateFont()' como 'CreateFontIndirect()', la cual espera un puntero a una estructura existente de tipo 'LOGFONT'.

Espero que esto aclare las dudas.

Steven