Pregunta

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 llamada simple a FillSolidRect).

Cuando se cambia el tamaño del diálogo, hay un tremendo parpadeo en curso. Para tratar de 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 evidente en todos los controles de los niños cuando se repintan.

¿Cómo puedo hacer que el diálogo no parpadee mientras se cambia el tamaño? Sospecho que el doble búfer debe ser importante, pero no estoy seguro de cómo hacerlo con un diálogo con controles secundarios (sin que todos los controles secundarios sean dibujados por el propietario o algo así).

Debo tener en cuenta que estoy usando C ++ (no .NET) y MFC, aunque las soluciones basadas en Win32 son bienvenidas :)

NOTA: Una cosa que probé 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);
¿Fue útil?

Solución

Suponiendo que " FillSolidRect " es el borrado de su fondo y luego devuelva VERDADERO de WM_ERASEBKGND.

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

Otros consejos

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 realice el borrado como parte de su WM_PAINT principal. Puede pintar de forma más inteligente de modo que solo vuelva a dibujar las áreas no válidas, o más fácilmente, doble búfer en el dibujo.

Al no hacer nada en el fondo de borrado, tiene todo el código de dibujo en una ubicación, lo que facilitará que otros puedan seguir y mantener.

Si está apuntando a WinXP o superior, también puede usar el estilo WS_EX_COMPOSITED para habilitar el búfer doble de manera predeterminada 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 retiros de los ciclos de OnPaint mediante GetDC, etc.

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

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

Los controles secundarios se cuidarán solos mientras te asegures de que CLIPCHILDREN .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top