Condividi tramite


Messaggio WM_PAINT

In genere, un'applicazione disegna una finestra in risposta a un messaggio di WM_PAINT . Il sistema invia questo messaggio a una procedura di finestra quando le modifiche apportate alla finestra hanno modificato il contenuto dell'area client. Il sistema invia il messaggio solo se non sono presenti altri messaggi nella coda dei messaggi dell'applicazione.

Dopo aver ricevuto un messaggio di WM_PAINT , un'applicazione può chiamare BeginPaint per recuperare il contesto del dispositivo visualizzato per l'area client e usarlo nelle chiamate alle funzioni GDI per eseguire le operazioni di disegno necessarie per aggiornare l'area client. Dopo aver completato le operazioni di disegno, l'applicazione chiama la funzione EndPaint per rilasciare il contesto del dispositivo visualizzato.

Prima di BeginPaint restituisce il contesto del dispositivo visualizzato, il sistema prepara il contesto del dispositivo per la finestra specificata. Imposta innanzitutto l'area di ritaglio per il contesto del dispositivo come uguale all'intersezione della parte della finestra che richiede l'aggiornamento e la parte visibile all'utente. Solo quelle parti della finestra che sono state modificate vengono ridisegnate. I tentativi di disegnare all'esterno di questa area vengono ritagliati e non vengono visualizzati sullo schermo.

Il sistema può anche inviare WM_NCPAINT e WM_ERASEBKGND messaggi alla procedura della finestra prima che BeginPaint restituisca. Questi messaggi indirizzano l'applicazione per disegnare l'area non client e lo sfondo della finestra. L'area non client è la parte di una finestra esterna all'area client. L'area include funzionalità come la barra del titolo, il menu finestra (noto anche come menu Di sistema ) e le barre di scorrimento. La maggior parte delle applicazioni si basa sulla funzione finestra predefinita DefWindowProc per disegnare questa area e quindi passare il messaggio di WM_NCPAINT a questa funzione. Lo sfondo della finestra è il colore o il modello che una finestra viene riempita prima dell'inizio di altre operazioni di disegno. Lo sfondo copre tutte le immagini precedentemente nella finestra o sullo schermo sotto la finestra. Se una finestra appartiene a una classe finestra con un pennello di sfondo della classe, la funzione DefWindowProc disegna automaticamente lo sfondo della finestra.

BeginPaint riempie una struttura PAINTSTRUCT con informazioni quali le dimensioni della parte della finestra da aggiornare e un flag che indica se lo sfondo della finestra è stato disegnato. L'applicazione può usare queste informazioni per ottimizzare il disegno. Ad esempio, può usare le dimensioni dell'area di aggiornamento, specificata dal membro rcPaint , per limitare il disegno solo a quelle parti della finestra che richiedono l'aggiornamento. Se un'applicazione ha un output molto semplice, può ignorare l'area di aggiornamento e disegnare nell'intera finestra, basandosi sul sistema per eliminare (clip) qualsiasi output non eseguito. Poiché il disegno di clip di sistema che si estende all'esterno dell'area di ritaglio, è visibile solo il disegno presente nell'area di aggiornamento.

BeginPaint imposta l'area di aggiornamento di una finestra su NULL. Cancella l'area, impedendo la generazione di messaggi successivi WM_PAINT . Se un'applicazione elabora un messaggio WM_PAINT ma non chiama BeginPaint o cancella l'area di aggiornamento, l'applicazione continua a ricevere messaggi WM_PAINT finché l'area non è vuota. In tutti i casi, un'applicazione deve cancellare l'area di aggiornamento prima di restituire dal messaggio di WM_PAINT .

Al termine del disegno dell'applicazione, deve chiamare EndPaint. Per la maggior parte delle finestre, EndPaint rilascia il contesto del dispositivo visualizzato, rendendolo disponibile per altre finestre. EndPaint mostra anche il caret, se in precedenza era nascosto da BeginPaint. BeginPaint nasconde il caret per impedire il danneggiamento delle operazioni di disegno.