2010-02-02 14 views

Respuesta

6

CWnd::Invalidate() invalida toda el área del cliente de una ventana, lo que indica que el área está desactualizada y debe volver a pintarse. Normalmente llamaría esto a un control que necesita volver a dibujarse. CWnd::InvalidateRect() invalida solo una parte de la ventana.

Con las funciones Invalidate, el mensaje WM_PAINT publicará [no es estrictamente verdadero; ver los comentarios] a la cola de mensajes y manejados en algún momento en el futuro. CWnd::UpdateWindow() envía (a diferencia de las publicaciones) un mensaje WM_PAINT, haciendo que las regiones invalidadas se vuelvan a dibujar inmediatamente.

Realmente, esto es todo en los documentos.

+0

quieres decir, no debemos llamar "Invalidar" o "CWnd :: UpdateWindow()" en una instancia en la aplicación ¿no? necesitamos llamar a cualquiera de ellas para obtener el mensaje wm_paint – Naruto

+3

De hecho. Llamar a ambos no es necesario. Por lo general, se llama a 'UpdateWindow' solo si el mismo hilo hace un cálculo extenso después, por lo que no volverá a su ciclo de mensajes lo suficientemente pronto. En ese caso, desea repintar inmediatamente, no esperar hasta un momento más conveniente. Pero, en general, usa 'Invalidate'. – Thomas

+0

oh ok Gracias. – Naruto

1

La función invalidate marca el área de dibujo como invalidada. Este indicador se usa cuando se vuelve a dibujar la ventana; si el área se invalida, redibujará el área, de lo contrario, simplemente abandonará el área de la pantalla tal como está. invalidate invalida todo el área de cliente de un objeto determinado, invalidaterect invalida una región específica del área de cliente. La función de actualización realiza el redibujado real.

El motivo de tal mecanismo, y no solo dibujar inmediatamente cuando usted sabe que algo debe cambiarse, es que puede evitar múltiples rediseños, por ejemplo, recibió tres mensajes de tecla de una vez, que desplazan un área de texto. Si volvió a dibujar el área de texto para cada una de las pulsaciones de tecla, tendría que dibujar el área de texto tres veces y la aplicación dejaría de responder. Al procesar en su lugar todos los eventos clave, actualizar la estructura de datos adjunta al área de texto e invalidar el área de texto antes de volver a dibujar el área de texto, solo vuelve a dibujar el área de texto una vez.

Cuestiones relacionadas