Pregunta

O para preguntar de otra manera, ¿cómo OnEraseBkgnd () funciona?

Estoy construyendo un control personalizado y di con este problema.
Childs son rectángulos, como de costumbre. Tenía que desactivar OnEraseBkgnd () y lo uso sólo el OnPaint ().
Lo que necesito es a eficiente despejar el área detrás del niño y sin parpadeos. < br> Técnicas como el uso de volver buffers no son una opción.

Editar : Estoy muy interesado en el algoritmo que hay debajo del capó de OnEraseBkgnd (). Sin embargo, cualquier respuesta es útil también será aceptada.

¿Fue útil?

Solución

Por lo general, en Windows, el más fácil (pero no más eficaz) los medios de reducción de parpadeo, es apagar el manejo de notificación WM_ERASEBKGND. Esto se debe a que si borra el fondo en el controlador de notificación, luego pintar la ventana del controlador de WM_PAINT, hay un pequeño retraso entre los dos -. Este retraso es visto como un parpadeo

En cambio, si lo hace todo el borrado y el dibujo en el controlador WM_PAINT, que tienden a ver mucho menos parpadeo. Esto es porque el retardo entre los dos se reduce. Seguirá viendo algún parpadeo, especialmente cuando el cambio de tamaño, porque todavía hay un pequeño retraso entre las dos acciones, y no siempre se puede conseguir en todo el dibujo antes de la próxima ocurrencia de la interrupción de borrado vertical para el monitor. Si no puede utilizar el doble buffer, entonces este es probablemente el método más eficaz será capaz de utilizar.

Usted puede obtener un mejor rendimiento de dibujo siguiendo la mayoría de las recomendaciones habituales alrededor de invalidación área de cliente - no invalidan toda la ventana a menos que realmente necesita. Tratar de invalidar sólo las áreas que han cambiado. También, usted debe utilizar las funciones BeginDeferWindowPos si está actualizando las posiciones de una colección de ventanas hijas al mismo tiempo.

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