29 Objetos básicos del GDI:
Plumas geométricas

En el capítulo 18 vimos cómo crear y usar plumas cosméticas, y hablamos un poco de plumas geométricas, aunque sin entrar en detalles. En este capítulo veremos cómo crear, usar y destruir plumas geométricas, así como sus características y propiedades.

Atributos de las plumas geométricas

Las plumas geométricas tienen siete atributos: anchura, estilo, color, patrón, rayado, estilo de extremos y estilo de uniones. Recordemos que las plumas cosméticas sólo tenían los tres primeros.

Los patrones y el rayado son atributos que hasta ahora sólo hemos asociado a pinceles, pero también los poseen las plumas geométricas.

Esto hace que las plumas geométricas sean más difíciles de crear, y más lentas a la hora de trazar líneas, pero son mucho más potentes y versátiles que las cosméticas.

Para crear plumas geométricas usaremos la función ExtCreatePen.

Veamos ahora algunos de esos atributos en detalle, y qué opciones existen.

Anchura

Vimos que en el caso de las plumas cosméticas, el grosor se expresaba en unidades de dispositivo, es decir, en pixels. En las geométricas se expresa en unidades lógicas, es decir, su anchura se ve afectada por las transformaciones del sistema de coordenadas.

Aunque solemos decir que las funciones CreatePen y CreatePenIndirect crean plumas cosméticas, esto es falso. Windows sólo crea plumas cosméticas de un pixel (cuando indicamos un grosor de cero en estas funciones), de modo que si creamos plumas más anchas usando estas funciones, en realidad estaremos creando plumas geométricas. Esta limitación de Windows no tiene por qué respetarse en futuras versiones, de modo que estas funciones, podrían crear plumas cosméticas de más de un pixel en el futuro, así que seguiremos diciendo que las plumas creadas usando estas dos funciones son cosméticas, aunque el grosor sea distinto de cero. Pero debemos tener en cuenta que estas plumas se verán afectadas por las transformaciones del espacio del mundo, o por el mapeo.

Estilo de línea

El estilo de línea define el tipo de trazos de las líneas. Recordemos los posibles estilos de línea:

Estilo Descripción
Sólido Las líneas serán continuas y sólidas.
Trazos Líneas de trazos.
Puntos Líneas de puntos.
Trazo y punto Líneas alternan puntos y trazos.
Trazo, punto, punto Líneas alternan líneas y dobles puntos.
Nulo Las líneas son invisibles.
Dentro de marco Las líneas serán sólidas. Sólo en el caso de plumas geométricas, y cuando se usan con funciones que requieran un rectángulo que sirva como límite, las dimensiones de la figura se reducirán para que se ajusten por completo al interior del rectángulo, teniendo en cuenta el grosor de la pluma.

En el caso de las plumas geométricas, los estilos no sólidos no están limitados a un pixel, como en el caso de las plumas cosméticas. Además, existe otro estilo posible, en el que el usuario puede definir las longitudes de los trazos y las separaciones.

Estilos
Estilos

Color

Especifica el color de la pluma. Se puede usar una estructura COLORREF para indicar el color.

Patrón

Especifica un patrón de mapa de bits que se repite en el trazo. Uno de los patrones es el de rayado, que puede ser cualquiera de los seis predefinidos. Pero también se pueden usar patrones creados a partir de cualquier mapa de bits de 8x8 pixels, patrones vacíos o sólidos.

Rayado

El rayado es un tipo particular de patrón. Normalmente nos referiremos a los rayados predefinidos, que son seis, como vimos en el capítulo de plumas:

Valor Significado
Diagonal descendente Trama de líneas diagonales a 45º descendentes de izquierda a derecha.
Cruz Trama de líneas horizontales y verticales.
Cruz diagonal Trama de líneas diagonales a 45º cruzadas.
Diagonal ascendente Trama de líneas diagonales a 45º ascendentes de izquierda a derecha.
Horizontal Trama de líneas horizontales.
Vertical Trama de líneas verticales.
Tramas
Tramas

Estilo de final (tapón)

Los extremos de las líneas pueden ser de diferentes tipos. Para las plumas geométricas tenemos tres posibles valores:

Valor Significado
Redondeado Las líneas terminan con un semicírculo.
Cuadrado Las líneas terminan con medio cuadrado.
Plano Las líneas terminan de forma abrupta.

Por ejemplo, estas líneas fueron trazadas con estos tres estilos de final.

Tapones
Tapones

Estilo de unión

Para las uniones de distintas líneas de una figura cerrada también disponemos de tres estilos. Estos estilos no se aplican a líneas unidas que no formen parte de una línea poligonal o de una figura cerrada:

Valor Significado
Redondeado Las esquinas se redondean.
Picudas (miter) Las esquinas se dejan sin recortar ni redondear.
Biseladas (Bevel) Las puntas de las esquinas se cortan a bisel.

Por ejemplo, estas figuras fueron trazadas con estos tres estilos de final. La azul con el estilo redondeado, la verde picuda y la roja viselada:

Uniones
Uniones

Crear una pluma geométrica

Para crear plumas geométricas se usa la función ExtCreatePen:

   HPEN pluma;
   LOGBRUSH lb = {BS_SOLID, RGB(240, 0, 0), 0};

   pluma = ExtCreatePen(
      PS_GEOMETRIC | PS_DASH | PS_ENDCAP_ROUND | PS_JOIN_ROUND,
      15, &lb, 0, NULL);

Como estas plumas pueden usar atributos de pincel para el trazado, necesitamos suministrar una estructura LOGBRUSH para definir el estilo y color de la pluma.

Seleccionar una pluma geométrica

No hay diferencia, a la hora de usarlas, entre las plumas geométricas y las cosméticas. En ambos casos, y como sucede con el resto de los objetos del GDI, se usa la función SelectObject:

   SelectObject(hdc, pluma);
   MoveToEx(hdc, 30, 30, NULL);
   LineTo(hdc, 400, 30);

Destruir una pluma geométrica

Y, por supuesto, cuando ya no necesitemos una pluma geométrica, deberemos destruirla y liberar los recursos que consume, usando la función DeleteObject:

   DeleteObject(pluma);

Ejemplo 30

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 30 win030.zip 2004-06-18 3398 bytes 538