¿Cómo llamo evento de pintura?

Mi progtwig dibuja texto en su panel, pero si quisiera eliminar el texto, tengo que volver a pintar.

¿Cómo puedo llamar (subir) el evento de pintura a mano?

El método Invalidate () causará un repintado.

MSDN Link

En un método de su Formulario o Control, tiene 3 opciones:

this.Invalidate(); // request a delayed Repaint by the normal MessageLoop system this.Update(); // forces Repaint of invalidated area this.Refresh(); // Combines Invalidate() and Update() 

Normalmente, solo debe llamar a Invalidate() y dejar que el sistema combine eso con otras actualizaciones de la pantalla. Si tiene prisa, debe llamar a Refresh() pero corre el riesgo de que se vuelva a pintar varias veces consecutivamente debido a otros controles (especialmente el principal) Invalidating.

La forma normal en que Windows (Win32 y WinForms.Net) maneja esto es esperar a que MessageQueue se ejecute en blanco y luego procesar todas las áreas de pantalla invalidadas. Eso es eficiente porque cuando algo cambia, generalmente cambia a otras cosas (controles) cambiando también.

El escenario más común para Update () es cuando cambia una propiedad (por ejemplo, etiqueta1.Texto, que invalidará la etiqueta) en un bucle for y ese bucle está bloqueando temporalmente el Message-Loop. Siempre que lo use, debería preguntarse si no debería usar un hilo en su lugar. Pero la respuesta no siempre es Sí.

Encontré el Invalidate () creando demasiado parpadeo. Esta es mi situación. Un control personalizado que estoy desarrollando dibuja todo su contenido mediante el manejo del evento Paint .

 this.Paint += this.OnPaint; 

Este controlador llama a una rutina personalizada que hace la pintura real.

 private void OnPaint(object sender, PaintEventArgs e) { this.DrawFrame(e.Graphics); } 

Para simular el desplazamiento, quiero volver a pintar mi control cada vez que se mueve el cursor mientras se presiona el botón izquierdo del mouse. Mi primera opción fue usar Invalidate () como el siguiente.

 private void RedrawFrame() { var r = new Rectangle( 0, 0, this.Width, this.Height); this.Invalidate(r); this.Update(); } 

El control se desplaza OK pero parpadea mucho más allá de cualquier nivel cómodo. Así que decidí, en lugar de repintar el control, llamar a mi método DrawFrame () personalizado directamente después de manejar el evento MouseMove . Eso produjo un desplazamiento suave sin parpadeos.

 private void RedrawFrame() { var g = Graphics.FromHwnd(this.Handle); this.DrawFrame(g); } 

Este enfoque puede no ser aplicable a todas las situaciones, pero hasta ahora me conviene.

Creo que también puedes llamar a Refresh() .

Call control.invalidate y se generará el evento de pintura.

Actualizar también haría que el código sea mucho más legible, dependiendo del contexto.

use Control.InvokePaint , también puede usarlo para el doble almacenamiento en el buffer manual