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 | 636 |
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 | 725 |