es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible verificar si un rectángulo dado interseca con el área invalidada dentro del evento OnPaint() utilizando la función GetUpdateRgn 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#:

    [DllImport("user32.dll")]
    public static extern IntPtr GetUpdateRgn(IntPtr hWnd, IntPtr hRgn, bool bErase);
    
    protected override void OnPaint(PaintEventArgs e)
    {   
        // Obtenga el identificador de la ventana de control
        IntPtr hWnd = this.Handle;
    
        // Cree una región para recibir el área invalidada
        Region region = new Region();
        IntPtr hRgn = region.GetHrgn(e.Graphics);
    
        // Llamada a GetUpdateRgn para obtener la región invalidada
        GetUpdateRgn(hWnd, hRgn, false);
    
        // Verifique si el rectángulo dado interseca con la región invalidada
        Rectangle myRect = new Rectangle(...);
        if (region.IsVisible(myRect))
        {
            // Dibuja el rectángulo
            e.Graphics.FillRectangle(Brushes.Red, myRect);
        }
    }
    

    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 subclasifica Control, deberá ajustar el código en consecuencia.

Comments are closed.