mensaje de WM_PAINT
El mensaje WM_PAINT se envía cuando el sistema u otra aplicación realiza una solicitud para pintar una parte de la ventana de una aplicación. El mensaje se envía cuando se llama a la función UpdateWindow o RedrawWindow , o bien mediante la función DispatchMessage cuando la aplicación obtiene un mensaje de WM_PAINT mediante la función GetMessage o PeekMessage .
Una ventana recibe este mensaje a través de la función WindowProc.
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
-
wParam
-
Este parámetro no se utiliza.
-
lParam
-
Este parámetro no se utiliza.
Una aplicación devuelve cero si procesa este mensaje.
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
Ejemplo tomado del directorio Windows Classic Samples de GitHub.
El sistema genera el mensaje WM_PAINT y no debe ser enviado por una aplicación. Para forzar que una ventana se dibuje en un contexto de dispositivo específico, use el mensaje WM_PRINT o WM_PRINTCLIENT . Tenga en cuenta que esto requiere que la ventana de destino admita el mensaje WM_PRINTCLIENT . Los controles más comunes admiten el mensaje WM_PRINTCLIENT .
La función DefWindowProc valida la región de actualización. La función también puede enviar el mensaje WM_NCPAINT al procedimiento de ventana si se debe pintar el marco de la ventana y enviar el mensaje WM_ERASEBKGND si se debe borrar el fondo de la ventana.
El sistema envía este mensaje cuando no hay otros mensajes en la cola de mensajes de la aplicación. DispatchMessage determina dónde enviar el mensaje; GetMessage determina qué mensaje se va a enviar. GetMessage devuelve el mensaje WM_PAINT cuando no hay otros mensajes en la cola de mensajes de la aplicación y DispatchMessage envía el mensaje al procedimiento de ventana adecuado.
Una ventana puede recibir mensajes de pintura internos como resultado de llamar a RedrawWindow con el conjunto de marcas RDW_INTERNALPAINT. En este caso, es posible que la ventana no tenga una región de actualización. Una aplicación puede llamar a la función GetUpdateRect para determinar si la ventana tiene una región de actualización. Si GetUpdateRect devuelve cero, la aplicación no necesita llamar a las funciones BeginPaint y EndPaint .
Una aplicación debe comprobar si hay una pintura interna necesaria examinando sus estructuras de datos internas para cada mensaje de WM_PAINT , ya que un mensaje de WM_PAINT puede haber sido causado por una región de actualización no NULL y una llamada a RedrawWindow con la marca RDW_INTERNALPAINT establecida.
El sistema envía un mensaje de WM_PAINT interno solo una vez. Después de que se devuelva un mensaje de WM_PAINT interno de GetMessage o PeekMessage o se envíe a una ventana mediante UpdateWindow, el sistema no envía ni envía más mensajes WM_PAINT hasta que se invalide la ventana o hasta que se vuelva a llamar a RedrawWindow con la marca RDW_INTERNALPAINT establecida.
Para algunos controles comunes, el valor predeterminado WM_PAINT procesamiento de mensajes comprueba el parámetro wParam . Si wParam no es NULL, el control asume que el valor es un HDC y pinta mediante ese contexto de dispositivo.
Requisito | Value |
---|---|
Cliente mínimo compatible |
Windows 2000 Professional [solo aplicaciones de escritorio] |
Servidor mínimo compatible |
Windows 2000 Server [solo aplicaciones de escritorio] |
Encabezado |
|