mapinfo español c++ winapi redraw

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í.

RedrawWindow

InvalidateRect

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.