Delen via


Contexten van privéweergaveapparaten

Een privéapparaatcontext stelt een toepassing in staat om te voorkomen dat een weergaveapparaatcontext wordt opgehaald en geïnitialiseerd telkens wanneer de toepassing in een venster moet tekenen. Privéapparaatcontexten zijn handig voor vensters waarvoor veel wijzigingen in de waarden van de kenmerken van de apparaatcontext nodig zijn om deze voor te bereiden op tekenen. Contexten van privéapparaten verminderen de tijd die nodig is om de apparaatcontext voor te bereiden en daarom de tijd die nodig is om tekenen uit te voeren in het venster.

Een toepassing leidt het systeem om een privéapparaatcontext voor een venster te maken door de CS_OWNDC stijl in de vensterklasse op te geven. Het systeem maakt elke keer een unieke privéapparaatcontext wanneer het een nieuw venster maakt dat deel uitmaakt van de klasse. In eerste instantie heeft de context van het privéapparaat dezelfde standaardwaarden voor kenmerken als een algemene apparaatcontext, maar de toepassing kan deze op elk gewenst moment wijzigen. Het systeem behoudt wijzigingen in de apparaatcontext voor de levensduur van het venster of totdat de toepassing aanvullende wijzigingen aanbrengt.

Een toepassing kan een ingang ophalen in de context van het privéapparaat met behulp van de functie GetDC- op elk moment nadat het venster is gemaakt. De toepassing moet de ingang slechts één keer ophalen. Daarna kan deze het greepje een willekeurig aantal keren behouden en gebruiken. Omdat een privéapparaatcontext geen deel uitmaakt van de contextcache van het weergaveapparaat, hoeft een toepassing de apparaatcontext nooit vrij te geven met behulp van de ReleaseDC--functie.

Het systeem past de apparaatcontext automatisch aan om wijzigingen in het venster weer te geven, zoals het verplaatsen of aanpassen van de grootte. Dit zorgt ervoor dat overlappende vensters altijd goed worden geknipt; Dat wil gezegd, er is geen actie vereist voor de toepassing om ervoor te zorgen dat er een knipsel wordt gemaakt. Het systeem wijzigt echter niet de apparaatcontext om de updateregio op te nemen. Bij het verwerken van een WM_PAINT bericht moet de toepassing daarom de updateregio opnemen door BeginPaint- aan te roepen of door de updateregio op te halen en deze te snijden met de huidige knipregio. Als de toepassing BeginPaint-niet aanroept, moet deze de updateregio expliciet valideren met behulp van de functie ValidateRect of ValidateRgn. Als de toepassing de updateregio niet valideert, ontvangt het venster een eindeloze reeks WM_PAINT berichten.

Omdat BeginPaint de caret verbergt als er een venster wordt weergegeven, moet een toepassing die BeginPaint- aanroept ook de functie EndPaint aanroepen om de caret te herstellen. EndPaint- heeft geen ander effect op een privéapparaatcontext.

Hoewel een privéapparaatcontext handig is om te gebruiken, is het geheugenintensief in termen van systeemresources, waarvoor 800 of meer bytes nodig zijn om op te slaan. Contexten van privéapparaten worden aanbevolen wanneer prestatieoverwegingen opwegen tegen de opslagkosten.

Het systeem bevat de context van het privéapparaat bij het verzenden van het WM_ERASEBKGND bericht naar de toepassing. De huidige selecties van de context van het privéapparaat, inclusief de toewijzingsmodus, zijn van kracht wanneer de toepassing of het systeem deze berichten verwerkt. Om ongewenste effecten te voorkomen, gebruikt het systeem logische coördinaten bij het wissen van de achtergrond; Hierbij wordt bijvoorbeeld de functie GetClipBox gebruikt om de logische coördinaten van het gebied op te halen om deze coördinaten te wissen en door te geven aan de functie FillRect. Toepassingen die deze berichten verwerken, kunnen vergelijkbare technieken gebruiken.

Een toepassing kan de functie GetDCEx gebruiken om af te dwingen dat het systeem een algemene apparaatcontext retourneert voor het venster met een privéapparaatcontext. Dit is handig voor het uitvoeren van snelle touch-ups naar een venster zonder de huidige waarden van de kenmerken van de context van het privéapparaat te wijzigen.