En el evento OnPaint(), ¿cómo comprobar si un rectángulo dado se interseca con la región invalidada?
En Winforms, es posible crear una región que no sea un rectángulo e invalidarla de esta manera:
Region region = new Region(new Rectangle(...));
region.Union(new Rectangle(...));
Invalidate(region);
Luego, en el evento OnPaint()
, solo se dibujará nuevamente la región invalidada anteriormente:
protected override void OnPaint(PaintEventArgs e)
{
//solo repintará la región invalidada anteriormente
//incluso si el área de ClipRectangle es más grande que eso
e.Graphics.FillRectangle(Brushes.Blue, e.ClipRectangle);
}
Dentro del evento OnPaint()
, ¿hay alguna manera de verificar si un rectángulo dado se intersecta con la zona invalidada?
Podría utilizar rectangle.Intersect(e.ClipRectangle)
pero esto podría dar falsos positivos.
EDITAR: parece que lo que quiero es posible utilizando la función de Win32 GetUpdateRgn
(según mi conocimiento, no hay una equivalencia directa de esa función en Winforms).
davy.ai
Sí, es posible verificar si un rectángulo dado interseca con el área invalidada dentro del evento
OnPaint()
utilizando la funciónGetUpdateRgn
de Win32. Sin embargo, no existe un equivalente directo de esta función en Winforms. Deberá utilizar Invoke Platform (P/Invoke) para llamar a la API de Win32 desde su código C#.Aquí hay un ejemplo de cómo utilizar
GetUpdateRgn
para obtener la región invalidada en C#:Tenga en cuenta que este código asume que ha creado un formulario o otro control que subclasifique la clase
Control
. Si está trabajando con un control personalizado que no subclasificaControl
, deberá ajustar el código en consecuencia.