Dela via


Privata visningsenhetskontexter

En privat enhetskontext gör det möjligt för ett program att undvika att hämta och initiera en visningsenhetskontext varje gång programmet måste rita i ett fönster. Privata enhetskontexter är användbara för fönster som kräver många ändringar i värdena för attributen i enhetskontexten för att förbereda den för ritning. Privata enhetskontexter minskar den tid som krävs för att förbereda enhetskontexten och därmed den tid som krävs för att utföra ritningen i fönstret.

Ett program instruerar systemet att skapa en privat enhetskontext för ett fönster genom att ange CS_OWNDC formatmall i fönsterklassen. Systemet skapar en unik privat enhetskontext varje gång det skapar ett nytt fönster som tillhör klassen. Från början har kontexten för den privata enheten samma standardvärden för attribut som en gemensam enhetskontext, men programmet kan ändra dessa när som helst. Systemet bevarar ändringar i enhetskontexten under hela fönstret eller tills programmet gör ytterligare ändringar.

Ett program kan hämta ett handtag till kontexten för den privata enheten med hjälp av funktionen GetDC när som helst efter att fönstret har skapats. Programmet måste bara hämta handtaget en gång. Därefter kan den behålla och använda handtaget valfritt antal gånger. Eftersom en privat enhetskontext inte ingår i cachen för visningsenhetens kontext behöver ett program aldrig släppa enhetskontexten med hjälp av funktionen ReleaseDC.

Systemet justerar automatiskt enhetskontexten så att den återspeglar ändringar i fönstret, till exempel flytt eller storleksändring. Detta säkerställer att alla överlappande fönster alltid klipps av korrekt. Ingen åtgärd krävs av programmet för att säkerställa urklipp. Systemet ändrar dock inte enhetskontexten så att den inkluderar uppdateringsregionen. När du bearbetar ett WM_PAINT meddelande måste programmet därför införliva uppdateringsregionen antingen genom att anropa BeginPaint- eller genom att hämta uppdateringsregionen och korsa den med den aktuella urklippsregionen. Om programmet inte anropar BeginPaintmåste det uttryckligen verifiera uppdateringsregionen med hjälp av funktionen ValidateRect eller ValidateRgn. Om programmet inte verifierar uppdateringsregionen får fönstret en oändlig serie WM_PAINT meddelanden.

Eftersom BeginPaint döljer caret om ett fönster visar det, bör ett program som anropar BeginPaint också anropa funktionen EndPaint för att återställa caret. EndPaint har ingen annan effekt på en privat enhetskontext.

Även om det är praktiskt att använda en privat enhetskontext är den minnesintensiv när det gäller systemresurser, vilket kräver 800 eller fler byte att lagra. Kontexter för privata enheter rekommenderas när prestandaöverväganden överväger lagringskostnader.

Systemet innehåller kontexten för den privata enheten när WM_ERASEBKGND skickas till programmet. De aktuella valen av den privata enhetskontexten, inklusive mappningsläge, gäller när programmet eller systemet bearbetar dessa meddelanden. För att undvika oönskade effekter använder systemet logiska koordinater när bakgrunden raderas. Den använder till exempel funktionen GetClipBox för att hämta områdets logiska koordinater för att radera och skickar koordinaterna till funktionen FillRect. Program som bearbetar dessa meddelanden kan använda liknande tekniker.

Ett program kan använda funktionen GetDCEx för att tvinga systemet att returnera en gemensam enhetskontext för fönstret som har en privat enhetskontext. Detta är användbart för att utföra snabba touch-ups till ett fönster utan att ändra de aktuella värdena för attributen i den privata enhetskontexten.