c++ - manual mapinfo 12.5 español
Diferencia entre InvalidateRect y RedrawWindow (4)
Cuando quiero volver a dibujar una ventana, ¿hay alguna función preferida para llamar entre InvalidateRect y RedrawWindow?
Por ejemplo, estas dos llamadas son iguales: (win sería un HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);
La (s) pregunta (s) principal (es) : ¿Cuándo debería usar una u otra? ¿Hay alguna diferencia que ocurra en el fondo? (diferentes WM_messages / focus / order / priorities ..)
La razón por la que quiero volver a dibujar la ventana es porque le envío una nueva imagen que deseo que muestre, lo que significa que el contenido de la ventana ya no es válido.
No me gusta simplemente dar enlaces, pero MSDN te brinda toda la información que necesitas y sería una pérdida de tiempo volver a escribir todo aquí.
En resumen, sí, hay diferencias. La pregunta es, ¿por qué quieres volver a dibujar la ventana? ¿Es porque los contenidos ya no son válidos? Si es así, use InvalidateRect
; de lo contrario, use RedrawWindow
.
RedrawWindow repinta la ventana de inmediato. InvalidateRect solo marca la ventana para volver a pintar en el siguiente mensaje WM_PAINT. Pero los mensajes WM_PAINT tienen una prioridad menor que otros mensajes, por lo que el repintado no será inmediato si su aplicación está ocupada manejando otros mensajes.
InvalidateRect
no vuelve a dibujar la ventana inmediatamente. Simplemente "programa" un redibujado futuro para un área rectangular específica de la ventana. Usando InvalidateRect
puede programar tantas áreas como desee, haciendo que se acumulen en algún buffer interno. El rediseño real de todas las áreas programadas acumuladas se realizará más tarde, cuando la ventana no tenga nada más que hacer. (Por supuesto, si la ventana está inactiva en el momento en que emite la llamada InvalidateRect
, el rediseño se realizará de inmediato).
También puede forzar un redibujado inmediato para todas las áreas invalidadas acumuladas actualmente llamando a UpdateWindow
. Pero, de nuevo, si no tiene prisa, no es necesario llamar explícitamente a UpdateWindow
, ya que una vez que la ventana está inactiva, realizará un rediseño para todas las áreas actualmente invalidadas automáticamente.
RedrawWindow
, por otro lado, es una función con un conjunto de capacidades mucho más amplio y flexible. Se puede usar para realizar la programación de invalidación (es decir, lo mismo que hace InvalidateRect
) o se puede usar para realizar un redibujado inmediato del área especificada, sin realizar ninguna "programación". En este último caso, llamar a RedrawWindow
es virtualmente equivalente a llamar a InvalidateRect
y llamar inmediatamente a UpdateWindow
.
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
e InvalidateRect(win, NULL, NULL);
son equivalentes. Ambas funciones invalidan la ventana. WM_PAINT
produce en el momento normal (no hay otros mensajes en la cola de la aplicación) en ambos casos.
Si desea que la pintura se realice inmediatamente, entonces llamar a RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)
o InvalidateRect
seguido de una UpdateWindow
lo hará.
RedrawWindow
simplemente da más opciones con los bits RDW_ *. Si todo lo que quiere es invalidar la ventana sin la pintura inmediata, entonces llamar a InvalidateRect
parece más limpio.