visual uso una tipos que opciones los hacer elementos dialogo cuadros cuadro como caja botones abrir windows dialog resize gdi flicker

uso - Cómo evitar el parpadeo al manejar WM_ERASEBKGND en el diálogo de Windows



que es una caja de dialogo en visual basic (6)

El doble buffering es la única forma de hacer que esto funcione.

Los controles CLIPCHILDREN de sí mismos siempre que se asegure CLIPCHILDREN .

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

Cuando se cambia el tamaño del diálogo, se produce un tremendo 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 diálogo no parpadee al cambiar el 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 puras basadas en Win32 son bienvenidas :)

NOTA: Una cosa que intenté pero que no funcionó (no estoy seguro de por qué) fue:

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


Intente agregar la siguiente línea a su función OnInitDialog:

ModifyStyle(0, WS_CLIPCHILDREN, 0);


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 su código de dibujo en una ubicación que debería facilitar el seguimiento y el mantenimiento de los demás.


Suponiendo que "FillSolidRect" es el borrado de tu fondo, entonces devuelve TRUE desde WM_ERASEBKGND.

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


Si su objetivo es 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.


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. Aquí hay un buen enlace para evitar parpadeos en la ventana.