WM_PAINT mensagem

A mensagem WM_PAINT é enviada quando o sistema ou outro aplicativo faz uma solicitação para pintar uma parte da janela de um aplicativo. A mensagem é enviada quando a função UpdateWindow ou RedrawWindow é chamada ou pela função DispatchMessage quando o aplicativo obtém uma mensagem WM_PAINT usando a função GetMessage ou PeekMessage .

Uma janela recebe essa mensagem por meio da função WindowProc.

LRESULT CALLBACK WindowProc(
  HWND hwnd, 
  UINT  uMsg, 
  WPARAM wParam, 
  LPARAM lParam     
);

Parâmetros

wParam

Este parâmetro não é usado.

lParam

Este parâmetro não é usado.

Retornar valor

Um aplicativo retornará zero se processar essa mensagem.

Exemplo

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);
}

Exemplo das Amostras do Windows Classic no GitHub.

Comentários

A mensagem WM_PAINT é gerada pelo sistema e não deve ser enviada por um aplicativo. Para forçar uma janela a desenhar em um contexto de dispositivo específico, use a mensagem WM_PRINT ou WM_PRINTCLIENT . Observe que isso requer a janela de destino para dar suporte à mensagem WM_PRINTCLIENT . Os controles mais comuns dão suporte à mensagem WM_PRINTCLIENT .

A função DefWindowProc valida a região de atualização. A função também poderá enviar a mensagem WM_NCPAINT para o procedimento de janela se o quadro da janela precisar ser pintado e enviar a mensagem WM_ERASEBKGND se o plano de fundo da janela precisar ser apagado.

O sistema envia essa mensagem quando não há outras mensagens na fila de mensagens do aplicativo. DispatchMessage determina para onde enviar a mensagem; GetMessage determina qual mensagem enviar. GetMessage retorna a mensagem WM_PAINT quando não há outras mensagens na fila de mensagens do aplicativo e DispatchMessage envia a mensagem para o procedimento de janela apropriado.

Uma janela pode receber mensagens de pintura internas como resultado da chamada redrawWindow com o sinalizador RDW_INTERNALPAINT definido. Nesse caso, a janela pode não ter uma região de atualização. Um aplicativo pode chamar a função GetUpdateRect para determinar se a janela tem uma região de atualização. Se GetUpdateRect retornar zero, o aplicativo não precisará chamar as funções BeginPaint e EndPaint .

Um aplicativo deve marcar para qualquer pintura interna necessária examinando suas estruturas de dados internas para cada mensagem WM_PAINT, pois uma mensagem WM_PAINT pode ter sido causada por uma região de atualização não NULL e uma chamada para RedrawWindow com o sinalizador RDW_INTERNALPAINT definido.

O sistema envia uma mensagem de WM_PAINT interna apenas uma vez. Depois que uma mensagem de WM_PAINT interna é retornada de GetMessage ou PeekMessage ou é enviada para uma janela por UpdateWindow, o sistema não publica nem envia mais mensagens WM_PAINT até que a janela seja invalidada ou até que RedrawWindow seja chamado novamente com o sinalizador RDW_INTERNALPAINT definido.

Para alguns controles comuns, o processamento de mensagens WM_PAINT padrão verifica o parâmetro wParam . Se wParam não for NULL, o controle pressupõe que o valor seja um HDC e pintará usando esse contexto de dispositivo.

Requisitos

Requisito Valor
Cliente mínimo com suporte
Windows 2000 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte
Windows 2000 Server [somente aplicativos da área de trabalho]
Cabeçalho
Winuser.h (inclui Windows.h)

Confira também

Visão geral de pintura e desenho

Mensagens de pintura e desenho

Beginpaint

DefWindowProc

Dispatchmessage

Endpaint

GetMessage

Getupdaterect

PeekMessage

Redrawwindow

Updatewindow

WM_ERASEBKGND

WM_NCPAINT

WM_PRINT

WM_PRINTCLIENT