Sdílet prostřednictvím


Zpráva WM_PAINT

Aplikace obvykle vykreslí okno v reakci na WM_PAINT zprávu. Systém odešle tuto zprávu do procedury okna, když dojde ke změně okna, která změnila obsah klientské oblasti. Systém zprávu odešle pouze v případě, že ve frontě zpráv aplikace nejsou žádné jiné zprávy.

Po přijetí zprávy WM_PAINT může aplikace zavolat BeginPaint pro načtení kontextu zobrazení zařízení pro klientskou oblast a použít jej při volání funkcí GDI k provedení nějakých operací kreslení, které jsou nezbytné k aktualizaci klientské oblasti. Po dokončení operací kreslení aplikace zavolá funkci EndPaint, která uvolní kontext zařízení pro zobrazení.

Než BeginPaint vrátí kontext zařízení pro zobrazení, systém připraví kontext zařízení pro zadané okno. Nejprve nastaví oblast výřezu kontextu zařízení tak, aby se rovnala průniku části okna, která potřebuje aktualizovat, a části, která je viditelná pro uživatele. Překreslují se jenom ty části okna, které se změnily. Pokusy kreslit mimo tuto oblast jsou zkráceny a nezobrazují se na obrazovce.

Systém může také odesílat WM_NCPAINT a WM_ERASEBKGND zprávy do procedury okna předtím, než se BeginPaint vrátí. Tyto zprávy nasměrují aplikaci tak, aby nakreslila oblast bez klienta a pozadí okna. Oblast neklientské je součástí okna, která je mimo klientskou oblast. Oblast zahrnuje prvky jako je titulkový pruh, okenní nabídka (označovaná také jako nabídka System) a posuvníky. Většina aplikací spoléhá na výchozí funkci okna, DefWindowProc, k nakreslení této oblasti a proto předává zprávu WM_NCPAINT této funkci. Pozadí okna je barva nebo vzor, kterým je okno vyplněno před zahájením jiných operací kreslení. Pozadí pokrývá všechny obrázky dříve v okně nebo na obrazovce pod oknem. Pokud okno patří do okenní třídy se štětcem pozadí, funkce DefWindowProc automaticky nakreslí pozadí okna.

BeginPaint vyplní strukturu PAINTSTRUCT informacemi, jako jsou rozměry části okna, které se mají aktualizovat, a příznak označující, zda bylo nakresleno pozadí okna. Aplikace může tyto informace použít k optimalizaci výkresu. Může například použít rozměry oblasti aktualizace určené rcPaint člen, aby se výkres omezil pouze na části okna, které potřebují aktualizaci. Pokud má aplikace velmi jednoduchý výstup, může oblast aktualizace ignorovat a nakreslit v celém okně a spoléhat se na to, že systém zahodí (vystřihne) jakýkoli nepotřebný výstup. Vzhledem k tomu, že systém ořezává kresby zasahující mimo ořezovou oblast, jsou viditelné pouze ty, které se nacházejí v oblasti aktualizace.

BeginPaint nastaví oblast aktualizace okna na null. Tím se oblast vymaže, což zabrání generování následných WM_PAINT zpráv. Pokud aplikace zpracuje WM_PAINT zprávu, ale nevolá BeginPaint nebo jinak vymaže oblast aktualizace, aplikace bude nadále přijímat WM_PAINT zprávy, pokud oblast není prázdná. Ve všech případech musí aplikace před návratem ze zprávy WM_PAINT vymazat oblast aktualizace.

Po dokončení výkresu aplikace by měla volat EndPaint. U většiny oken EndPaint uvolní kontext zařízení pro zobrazení a zpřístupní ho pro ostatní okna. EndPaint také zobrazuje kurzor, pokud byl dříve skryt BeginPaint. BeginPaint skryje kurzor za účelem zabránění poškození operací kreslení.