20 Objetos básicos del GDI:
El pincel (Brush)

El pincel se utiliza para rellenar superficies y figuras cerradas. En este capítulo veremos cómo crearlos, seleccionarlos y destruirlos, y cómo elegir el estilo, textura y color para un pincel.

Al igual que vimos con las plumas, el proceso con todos los objetos es siempre el mismo, hay que crearlos, seleccionarlos y, cuando ya no se necesiten, destruirlos.

Pinceles lógicos

Existen cuatro tipos distintos de pinceles lógicos.

  • Sólidos, consisten en un único color continuo.
  • Stock, pinceles predefinidos por el sistema.
  • Hatch, tramas de líneas.
  • Patrones, consisten en mapas de bits.

Pinceles sólidos

Son los más simples, se usan para rellenar superficies con un único color uniforme. Para crear uno de estos pinceles se usa la función CreateSolidBrush, que sólo requiere que se especifique el color del pincel.

Pinceles de Stock

Del mismo modo que sucede con las plumas, también disponemos de un juego de pinceles de stock que podremos usar en nuestros programas.

En el caso de los objetos de stock, no es necesario crearlos ni destruirlos, siempre podemos obtener un manipulador y seleccionarlo para usarlo.

En el caso de los pinceles, existen siete en el stock:

Valor Significado
BLACK_BRUSH Pincel negra
DKGRAY_BRUSH Pincel gris oscuro
GRAY_BRUSH Pincel gris
HOLLOW_BRUSH Pincel hueco
LTGRAY_BRUSH Pincel gris claro
NULL_BRUSH Pincel nulo (equivale a HOLLOW_BRUSH)
WHITE_BRUSH Pincel blanco

Ya vimos que para obtener un manipulador para una de esos objetos de stock se usa la función GetStockObject. Dependiendo del valor que usemos obtendremos un tipo de objeto diferente.

Pinceles de tramas (Hatch)

Consisten en tramas de líneas paralelas, que permiten crear superficies ralladas.

Para crear pinceles tramados se usa la función CreateHatchBrush. Además del color podemos escoger entre varias tramas distintas.

Existen seis tipos de tramas predefinidas, accesibles mediante constantes:

Valor Significado
HS_BDIAGONAL Trama de líneas diagonales a 45º descendentes de izquierda a derecha.
HS_CROSS Trama de líneas horizontales y verticales.
HS_DIAGCROSS Trama de líneas diagonales a 45º cruzadas.
HS_FDIAGONAL Trama de líneas diagonales a 45º ascendentes de izquierda a derecha.
HS_HORIZONTAL Trama de líneas horizontales.
HS_VERTICAL Trama de líneas verticales.

Pinceles de patrones

Este tipo de pincel se crea a partir de un mapa de bits, así que en realidad puede ser cualquier tipo de imagen. Antes de poder crear uno de estos pinceles tendremos que disponer de un mapa de bits, que, como comentamos antes, es otro de los objetos de GDI que podemos manejar.

Supondremos que ya sabemos crear un objeto de mapa de bits, aunque explicaremos cómo hacerlo en próximos capítulos.

Para crear un pincel de patrón disponemos de tres funciones: CreatePatternBrush, CreateDIBPatternBrushPt y CreateDIBPatternBrush. La primera sólo requiere un manipulador de un mapa de bits. La segunda y la tercera permiten usar mapas de bits independientes del dispositivo, lo cual proporciona mayor control sobre la paleta de colores.

Para poder usar este tipo de pinceles hay que estar algo más familiarizado con los mapas de bits, volveremos sobre este tema cuando hayamos visto el objeto bitmap.

Crear un pincel

Además de las funciones mencionadas para crear pinceles de los distintos tipos lógicos mencionados, existe una función más para crear pinceles: CreateBrushIndirect.

Esta función sirve para crear pinceles lógicos, pero lo hace a través de una estructura LOGBRUSH, que almacena en su interior los parámetros necesarios para crear un pincel sólido, de trama o de patrón.

Seleccionar un pincel

Con los pinceles sucede lo mismo que con las plumas, aunque podemos tener de un repertorio de manipuladores de pincel, sólo puede haber uno activo en cada momento, para seleccionar el pincel activo se usa la función SelectObject.

Como ya hemos dicho el tipo de objeto seleccionado depende del parámetro que se pase a la función. El nuevo objeto seleccionado reemplaza al actual, y se devuelve el manipulador del objeto seleccionado anteriormente.

Se debe guardar el manipulador del pincel por defecto seleccionado antes de cambiarlo por primera vez, y restablecerlo antes de terminar el procedimiento de pintar.

Destruir un pincel

Por último, cuando ya no necesitemos más los manipuladores de pinceles, debemos destruirlos, con el fin de liberar la memoria usada para almacenarlos. Esto se hace mediante la función DeleteObject.

Ejemplo 18

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 18 win018.zip 2004-01-18 2261 bytes 762