25 Objetos básicos del GDI:
Rectángulos y Regiones

Rectángulos

Los rectángulos se usan en Windows para muchas cosas, y disponen de estructuras y funciones dedicadas a manejarlos.

Ya los hemos usado, por ejemplo, para invalidar parte de la ventana y obligar al Windows a actualizarla, para ello usamos la función InvalidateRect, también los hemos usado para obtener las dimensiones del área de cliente con GetClientRect.

Lo primero que tenemos que ver es la estructura RECT, aunque ya la hemos usado muchas veces en este curso.

Esta estructura define un rectángulo mediante las coordenadas de la parte izquierda, superior, derecha e inferior del rectángulo: left, top, right y bottom. Podemos decir que estos valores definen dos puntos: la esquina superior izquierda y la inferior derecha. Es importante tener claro esto, ya que si la coordenada izquieda es mayor que la derecha, o la superior mayor que la inferior, no estaremos definiendo un rectángulo, al menos desde el punto de vista del API.

Funciones para trabajar con rectángulos

Veremos a continuación algunas de las funciones para trabajar con rectángulos.

Asignar rectángulos

En cuanto a las funciones de asignación, tenemos:

Función Utilidad
SetRect Sirve para asignar valores a un rectángulo.
CopyRect Hace una copia de un rectángulo.
SetRectEmpty Crea un rectángulo vacío.

Un rectángulo vacío es aquel en el que todas sus coordenadas son cero.

Comparaciones de rectángulos

Tenemos tres funciones para comparar rectángulos:

Función Utilidad
IsRectEmpty Nos dice si un rectángulo es vacío.
EqualRect Nos dice si dos rectángulos son iguales.
PtInRect Nos dice si un punto está dentro de un rectángulo. Un punto en el lado inferior o en el derecho se considera fuera del rectángulo.

Modificar rectángulos

Para modificar rectángulos, tenemos otras dos:

Función Utilidad
InflateRect Nos permite agrandar o reducir un rectángulo.
OffsetRect Nos permite trasladar un rectángulo.

Operaciones con rectángulos

Por último, para operar con rectángulos, tenemos otras tres:

Función Utilidad
IntersectRect Obtiene la intersección de dos rectángulos.
UnionRect Obtiene la unión de dos rectángulos.
SubtractRect Obtiene la diferencia emtre dos rectángulos.

La intersección de dos rectángulos es siempre un rectángulo, hay un caso especial, cuando los rectángulos no tienen ninguna superficie en común. En ese caso, el resultado es un rectángulo vacío.

En el caso de uniones, se define la unión de dos rectángulos como el rectángulo más pequeño que incluye ambos rectángulos.

La función de diferencia es algo más restrictiva con los rectángulos que admite como parámetros, ya que deben cortarse completamente al menos en uno de los ejes.

Veremos el uso de rectángulos sobre la marcha, como los hemos visto hasta ahora, sin haberlos explicado en detalle.

Ejemplo 24

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 24 win024.zip 2024-10-07 4353 bytes 635

Regiones

Las regiones son figuras como rectángulos, elipses o polígonos, o combinaciones de ellos. Y sus aplicaciones son análogas a las de los rectángulos, aunque como veremos, más completas.

Las regiones se manejan mediante manipuladores, y se puede usar para invalidar partes del área de cliente, InvalidateRgn.

Funciones para regiones

Veremos ahora algunas de las funciones de las que disponemos para trabajar con regiones.

Crear regiones

Como en el caso de los rectángulos, disponemos de varias funciones para crear regiones:

Función Utilidad
CreateRectRgn Crea una región rectángular.
CreateRectRgnIndirect Crea una región rectángular a partir de una estructura RECT.
CreateRoundRectRgn Crear una región rectángulas con las esquinas redondeadas.
CreateEllipticRgn Crea una región elíptica.
CreateEllipticRgnIndirect Crea una región elíptica a partir de una estructura RECT que define el rectángulo que inscribe a la elipse.
CreatePolygonRgn Crea una región poligonal.
CreatePolyPolygonRgn Crea una región compuesta por varios polígonos.

Cualquier región se puede seleccionar para un contexto de dispositivo, usando la función SelectObject.

Disponemos de un amplio conjunto de operaciones que se pueden realizar con regiones: combinarlas, compararlas, obtener sus dimensiones, pintarlas, recuadrarlas, etc.

Combinar regiones

Para combinar regiones se usa la función CombineRgn, esta función permite combinar dos regiones de cinco formas diferentes:

Combinación Resultado
RGN_AND La nueva región es la intersección de las dos regiones combinadas.
RGN_COPY El resultado no tiene en cuenta la segunda región, es siempre una copia de la primera.
RGN_DIFF La nueva región es la diferencia entre las dos regiones, la primera menos la parte común.
RGN_OR La nueva región es la suma de las dos regiones combinadas.
RGN_XOR La nueva región es la suma de las dos regiones combinadas, excluyendo las partes comunes.

Comparar regiones

Podemos comparar dos regiones usando la función EqualRgn, dos regiones se consideran iguales si tienen el mismo tamaño y forma.

Rellenar regiones

Para rellenar regiones se usa la función FillRgn, al igual que vimos en el capítulo 21, el modo de relleno de polígonos también afecta a la hora de rellenar regiones. Podemos por lo tanto, usar las funcones SetPolyFillMode y GetPolyFillMode para cambiar o consultar el modo de relleno actual.

Otra función parecida es PaintRgn, que usa el pincel actual, en lugar de tener que especificar uno. Los modos de relleno de polígonos afectan del mismo modo que en FillRgn.

La función InvertRgn invierte los colores presentes en la pantalla para la región especificada. En blanco y negro, invertir significa cambiar los pixels blancos por negros y viceversa. En color, el resultado depende del tipo de dispositivo.

El otro modo de mostrar una región es enmarcarla, para eso se usa la función FrameRgn. Enmarcar una región significa trazar una línea a su alrededor, para lo que hay que especificar un pincel y la anchura y altura del marco.

Mover una región

Mediante la función OffsetRgn podemos desplazar una región en cualquier dirección.

Comprobar posiciones

Tenemos dos funciones para hacer verificaciones sobre regiones, PtInRegion verifica si un punto está en el interior de una región o no. Esto nos será útil cuando trabajemos con el ratón, para saber si el cursor pasa por determinadas zonas de la ventana.

La otra función es RectInRegion, que verifica si alguna parte de un rectángulo está dentro de una región determinada.

En próximos capítulos veremos como podemos usar una región o un camino para definir un área de recorte. Fuera de la zona definida como área de recorte no se producirá ninguna salida gráfica. Esto nos permite crear formas elaboradas.

Destruir regiones

Como otros objetos del GDI, hay que destruir las regiones cuando ya no nos hagan falta, liberando de ese modo los recursos usados. Para destruir una región se usa la función DeleteObject.

Ejemplo 25

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 25 win025.zip 2004-05-30 3232 bytes 724