Cosas mías

August 10, 2005

Pintar sin parpadeo con GDI+ o zxSameGame (II)

Filed under: Programación

Cuando hice la primera versión del programa, me encontré con un gravísimo problema a la hora de sobrecargar el evento OnPaint: no importa lo rápido que pinte, el control muestra un molesto parpadeo, incluso si el pintado se realiza fuera del control y luego se hace una copia BitBlt.

Mi primer pensamiento fue que el GDI+ (recordemos que se trata de la forma de pintar del .NET Framework) no estaba a la altura de las circunstancias, más que nada porque había seguido las directivas según se documenta en el Petzold para C# y en el de Profesional C# de Wrox.

Luego vino la investigación y las recomendaciones de la gente de los foros… Al final resulta que el GDI+ no sólo está a la altura de las circunstancias, sino que las supera, facilitando enormemente el trabajo, pues, si así lo decides, los controles se pueden pintar con técnicas de doble buffer ellos mismos. Como en este proyecto pinto en la ficha directamente, pongo el código siguiente en el constructor y ya no se produce ningún parpadeo:

    InitializeComponent();
    SetStyle(ControlStyles.DoubleBuffer|ControlStyles.AllPaintingInWmPaint,true);
  • ControlStyles.DoubleBuffer habilita las opciones de doble buffer para el control.
  • ControlStyles.AllPaintingInWmPaint indica que no se debe pintar primero el fondo, sino que el propio método Paint se ocupará de todo.
  • El segundo valor es necesario, porque si no, el GDI+ llama primero a una función interna para que pinte el fondo y luego se llama al método Paint sobrecargado, lo que genera el suficiente retardo como para producir extraños efectos estroboscópicos.

    Al final estoy haciendo el programa en C#, y por ahora se encuentra en un estado bastante avanzado, casi terminado.

    3 Comments »

    The URI to TrackBack this entry is: http://rfog.blogsome.com/2005/08/10/pintar-sin-parpadeo-con-gdi-o-zxsamegame-ii/trackback/

    1. El parpadeo de mis controles en C# siempre me molesto y creí que era una deficiencia del GDI+ …

      Te adradezco enormemente que hayas publicado la solución, me ha servido muchisimo.

      Un cordial saludo

      Comment by Almustafa — November 21, 2006 @ 12:02 am

    2. Gracias por tu solucion:

      Ya que me ha ayudado muchisimo.

      Saludos

      Comment by lovosergio3d — June 18, 2007 @ 8:20 pm

    3. Como los demás, estoy muy agradecido por esta solución.

      Gracias.

      Comment by Joshua03 — July 16, 2008 @ 8:42 pm

    RSS feed for comments on this post.

    Leave a comment

    Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



    Anti-spam measure: please retype the above text into the box provided.

    Get free blog up and running in minutes with Blogsome
    Theme designed by Gary Rogers