2008-10-02 9 views
9

Tengo un cuadro de diálogo que cambia de tamaño. También tiene un fondo personalizado que pinto en respuesta a una llamada WM_ERASEBKGND (actualmente una simple llamada a FillSolidRect).Cómo evitar el parpadeo al manejar WM_ERASEBKGND en el cuadro de diálogo de Windows

Cuando se cambia el tamaño del cuadro de diálogo, se produce un enorme parpadeo. Para intentar reducir el parpadeo, enumero todas las ventanas secundarias y las agrego a la región de recorte. Eso parece ayudar un poco, ahora el parpadeo es más evidente en todos los controles de niños mientras repintan.

¿Cómo puedo hacer que el cuadro de diálogo no parpadee durante el cambio de tamaño? Sospecho que el doble almacenamiento debe jugar un papel, pero no estoy seguro de cómo hacer eso con un diálogo con controles secundarios (sin hacer que todos los controles secundarios sean dibujados por el propietario o algo así).

Debo señalar que estoy usando C++ (no NET), y MFC, aunque las soluciones basadas en Win32 puros son bienvenidos :)

NOTA: Una cosa he intentado pero que no funcionó (no seguro por qué) fue:

CDC memDC; 
memDC.CreateCompatibleDC(pDC); 
memDC.FillSolidRect(rect, backgroundColor); 

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); 

Respuesta

8

Suponiendo que "FillSolidRect" es el borrado de sus antecedentes y luego volver verdadero de lo WM_ERASEBKGND.

Para hacer el doble búfer que está haciendo casi en su fragmento de código, necesitará usar CreateCompatibleBitmap y seleccionarlo en su memDC.

3

El doble almacenamiento en búfer es de hecho la única manera de hacer que esto funcione.

Los controles secundarios se encargarán siempre que se asegure CLIPCHILDREN.

5

No haga nada en el manejo de WM_ERASEBKGND y borre como parte de su WM_PAINT principal. Puede pintar de manera más inteligente para que solo vuelva a dibujar las áreas no válidas, o más fácilmente, doble el buffer del dibujo.

Al no hacer nada en el fondo de borrado, tiene todo el código de dibujo en una ubicación que debería facilitar el seguimiento y el mantenimiento de los demás.

6

Trate de añadir la siguiente línea a su función OnInitDialog:

ModifyStyle(0, WS_CLIPCHILDREN, 0); 
5

Si se dirige a WinXP o superior, también puede usar el estilo WS_EX_COMPOSITED para habilitar el doble almacenamiento en el búfer por defecto para las ventanas de nivel superior con este estilo. Tenga en cuenta que esto tiene su propio conjunto de limitaciones, específicamente, no más extracción de ciclos de OnPaint usando GetDC, etc.

4

puede establecer el parámetro de su llamada al método InvalidateRect como falso. Esto evitará que envíe WM_ERASEBKGND cuando la ventana se volverá a dibujar. Here es un buen enlace para evitar el parpadeo en la ventana.

Cuestiones relacionadas