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.

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