Capítulo 18 Objetos básicos del GDI: La pluma (Pen)

La pluma se utiliza para trazar líneas y curvas. En este capítulo veremos cómo crearlas, seleccionarlas y destruirlas, y cómo elegir el estilo, grosor y color para una pluma.

El proceso con los objetos es siempre el mismo, hay que crearlos, seleccionarlos y, cuando ya no se necesiten, destruirlos.

Plumas de Stock

La única excepción a lo dicho antes es un pequeño almacén de objetos que usa el sistema y que están disponibles para usar en nuestros programas.

El ejemplo anterior funciona gracias a ello, ya que usa la pluma por defecto del DC. En el caso de los objetos de stock, no es necesario crearlos ni destruirlos (aunque esto último no está prohibido), siempre podemos obtener un manipulador y seleccionarlo para usarlo.

Concretamente, en el caso de las plumas, existen tres en el stock:

Valor Significado
BLACK_PEN Pluma negra
NULL_PEN Pluma nula
WHITE_PEN Pluma blanca

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.

Plumas cosméticas y geométricas

Existen dos categorías de plumas.

Las cosméticas se crean con un grosor expresado en unidades de dispositivo, es decir, las líneas que se tracen con estas plumas tendrán siempre el mismo grosor. Estas plumas sólo tienen tres atributos: grosor, color y estilo. Las plumas de stock son de este tipo.

Las geométricas se crean con un grosor expresado en unidades lógicas. Esto significa que el grosor de las líneas puede ser escalado, y depende de la transformaciones actuales del "mundo actual" (veremos esto en siguientes capítulos). Además de los tres atributos que también tienen las plumas cosméticas, las geométricas poseen otros cuatro: plantilla, trama opcional, estilos para extremos y para uniones.

Las líneas trazadas con plumas cosméticas son entre tres y diez veces más rápidas que las de las geométricas.

Crear una pluma

Si no vamos a utilizar una pluma de stock, (la verdad es que están muy limitadas), podemos crear nuestras propias plumas.

Para ello disponemos de la función CreatePen. Esta función también nos devuelve un manipulador, en este caso de pluma, que podremos usar posteriormente para seleccionar la nueva pluma.

CreatePen nos pide tres parámetros. El primero es el estilo de línea, podemos elegir uno de los siguientes valores:

Estilo Descripción
PS_SOLID Las líneas serán continuas y sólidas.
PS_DASH Líneas de trazos. Este estilo sólo es válido cuando el ancho de la pluma sea uno o menos en unidades de dispositivo.
PS_DOT Líneas de puntos. Este estilo sólo es válido cuando el ancho de la pluma sea uno o menos en unidades de dispositivo.
PS_DASHDOT Líneas alternan puntos y trazos. Este estilo sólo es válido cuando el ancho de la pluma sea uno o menos en unidades de dispositivo.
PS_DASHDOTDOT Líneas alternan líneas y dobles puntos. Este estilo sólo es válido cuando el ancho de la pluma sea uno o menos en unidades de dispositivo.
PS_NULL Las líneas son invisibles.
PS_INSIDEFRAME Las líneas serán sólidas. Cuando ésta pluma se usa en cualquier función de dibujo del GDI que requiera 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. Esto sólo se aplica a plumas geométricas.

El segundo parámetro es el grosor de la línea en unidades lógicas, si se especifica un grosor de cero, la línea tendrá un pixel de ancho.

El último parámetro es un COLORREF, que será el color de las líneas.

Evidentemente, CreatePen sólo puede crear plumas cosméticas.

Existen otras dos funciones para crear plumas: CreatePenIndirect y ExtCreatePen.

La primera sirve también para crear plumas cosméticas, pero lo hace a través de una estructura LOGPEN, que almacena en su interior los mismos parámetros que se pasan a la función CreatePen. Esto puede ser útil cuando creemos muchas plumas distintas o varias con muy pocas diferencias.

La segunda nos permite crear tanto plumas cosméticas como geométricas. De momento no veremos este tipo de plumas, las dejaremos para capítulos más avanzados.

Seleccionar una pluma

Aunque podemos disponer de un repertorio de manipuladores de pluma, sólo puede haber una activa en cada momento, para seleccionar la pluma activa se usa la función SelectObject.

En realidad, ésta función sirve para seleccionar cualquier tipo de objeto, no sólo plumas. El tipo de objeto seleccionado depende el 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 de la pluma por defecto seleccionada antes de cambiarla por primera vez, y restablecerlo antes de terminar el procedimiento de pintar.

Destruir una pluma

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

Ejemplo 16

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 16 win016.zip 2004-01-18 2178 bytes 259