Share via


Mensaje de WM_PAINT

Normalmente, una aplicación dibuja en una ventana en respuesta a un mensaje de WM_PAINT . El sistema envía este mensaje a un procedimiento de ventana cuando los cambios en la ventana han modificado el contenido del área de cliente. El sistema envía el mensaje solo si no hay otros mensajes en la cola de mensajes de la aplicación.

Al recibir un mensaje de WM_PAINT , una aplicación puede llamar a BeginPaint para recuperar el contexto del dispositivo de visualización para el área cliente y usarlo en llamadas a funciones GDI para llevar a cabo las operaciones de dibujo necesarias para actualizar el área de cliente. Después de completar las operaciones de dibujo, la aplicación llama a la función EndPaint para liberar el contexto del dispositivo para mostrar.

Antes de Que BeginPaint devuelva el contexto del dispositivo para mostrar, el sistema prepara el contexto del dispositivo para la ventana especificada. En primer lugar, establece que la región de recorte del contexto del dispositivo sea igual a la intersección de la parte de la ventana que necesita actualizarse y la parte visible para el usuario. Solo se vuelven a dibujar las partes de la ventana que han cambiado. Los intentos de dibujar fuera de esta región se recortan y no aparecen en la pantalla.

El sistema también puede enviar mensajes WM_NCPAINT y WM_ERASEBKGND al procedimiento de ventana antes de que BeginPaint devuelva. Estos mensajes dirigen a la aplicación para dibujar el área no cliente y el fondo de la ventana. El área no cliente es la parte de una ventana que está fuera del área de cliente. El área incluye características como la barra de título, el menú de ventanas (también conocido como el menú Sistema ) y las barras de desplazamiento. La mayoría de las aplicaciones se basan en la función de ventana predeterminada, DefWindowProc, para dibujar esta área y, por tanto, pasar el mensaje WM_NCPAINT a esta función. El fondo de la ventana es el color o patrón con el que se rellena una ventana antes de que comiencen otras operaciones de dibujo. El fondo cubre las imágenes anteriores en la ventana o en la pantalla debajo de la ventana. Si una ventana pertenece a una clase de ventana que tiene un pincel de fondo de clase, la función DefWindowProc dibuja automáticamente el fondo de la ventana.

BeginPaint rellena una estructura PAINTSTRUCT con información como las dimensiones de la parte de la ventana que se van a actualizar y una marca que indica si se ha dibujado el fondo de la ventana. La aplicación puede usar esta información para optimizar el dibujo. Por ejemplo, puede usar las dimensiones de la región de actualización, especificadas por el miembro rcPaint , para limitar el dibujo solo a las partes de la ventana que necesitan actualizarse. Si una aplicación tiene una salida muy sencilla, puede omitir la región de actualización y dibujar en toda la ventana, dependiendo del sistema para descartar (clip) cualquier salida innecesaria. Dado que el dibujo de clips del sistema que se extiende fuera de la región de recorte, solo está visible el dibujo que se encuentra en la región de actualización.

BeginPaint establece la región de actualización de una ventana en NULL. Esto borra la región, lo que impide que genere mensajes WM_PAINT posteriores. Si una aplicación procesa un mensaje de WM_PAINT pero no llama a BeginPaint ni borra la región de actualización, la aplicación sigue recibiendo mensajes WM_PAINT siempre y cuando la región no esté vacía. En todos los casos, una aplicación debe borrar la región de actualización antes de volver del mensaje WM_PAINT .

Cuando la aplicación termine de dibujar, debe llamar a EndPaint. Para la mayoría de las ventanas, EndPaint libera el contexto del dispositivo para mostrar, lo que hace que esté disponible para otras ventanas. EndPaint también muestra el símbolo de intercalación, si anteriormente estaba oculto por BeginPaint. BeginPaint oculta el símbolo de intercalación para evitar que las operaciones de dibujo la dañen.