Freigeben über


Kontexte für private Anzeigegeräte

Mit einem privaten Gerätekontext kann eine Anwendung vermeiden, dass ein Anzeigegerätekontext jedes Mal abgerufen und initialisiert wird, wenn die Anwendung in einem Fenster zeichnen muss. Private Gerätekontexte sind für Fenster nützlich, die viele Änderungen an den Werten der Attribute des Gerätekontexts erfordern, um ihn für das Zeichnen vorzubereiten. Private Gerätekontexte reduzieren die Zeit, die zum Vorbereiten des Gerätekontexts erforderlich ist, und damit die Zeit, die zum Ausführen der Zeichnung im Fenster erforderlich ist.

Eine Anwendung weist das System an, einen privaten Gerätekontext für ein Fenster zu erstellen, indem in der Fensterklasse der CS_OWNDC Stil angegeben wird. Das System erstellt bei jedem Erstellen eines neuen Fensters, das zur -Klasse gehört, einen eindeutigen privaten Gerätekontext. Zunächst hat der Kontext des privaten Geräts dieselben Standardwerte für Attribute wie ein allgemeiner Gerätekontext, aber die Anwendung kann diese jederzeit ändern. Das System behält Änderungen am Gerätekontext für die Lebensdauer des Fensters bei oder bis die Anwendung zusätzliche Änderungen vornimmt.

Eine Anwendung kann jederzeit nach der Erstellung des Fensters mithilfe der GetDC-Funktion ein Handle für den Kontext des privaten Geräts abrufen. Die Anwendung muss das Handle nur einmal abrufen. Danach kann das Handle beliebig oft beibehalten und verwendet werden. Da ein privater Gerätekontext nicht Teil des Kontextcaches des Anzeigegeräts ist, muss eine Anwendung den Gerätekontext niemals mithilfe der ReleaseDC-Funktion freigeben.

Das System passt den Gerätekontext automatisch an Änderungen am Fenster an, z. B. Verschieben oder Größenanpassung. Dadurch wird sichergestellt, dass alle überlappenden Fenster immer ordnungsgemäß beschnitten werden. Das heißt, die Anwendung erfordert keine Aktion, um das Beschneiden sicherzustellen. Das System überarbeite den Gerätekontext jedoch nicht, um den Updatebereich einzuschließen. Daher muss die Anwendung bei der Verarbeitung einer WM_PAINT Nachricht den Updatebereich entweder durch Aufrufen von BeginPaint oder durch Abrufen des Updatebereichs und Überschneiden mit dem aktuellen Clippingbereich integrieren. Wenn die Anwendung BeginPaint nicht aufruft, muss sie den Updatebereich explizit mithilfe der ValidateRect - oder ValidateRgn-Funktion überprüfen. Wenn die Anwendung den Updatebereich nicht überprüft, empfängt das Fenster eine endlose Reihe von WM_PAINT Meldungen.

Da BeginPaint das Caret ausblendet, wenn es in einem Fenster angezeigt wird, sollte eine Anwendung, die BeginPaint aufruft, auch die EndPaint-Funktion aufrufen, um das Caret wiederherzustellen. EndPaint hat keine anderen Auswirkungen auf den Kontext eines privaten Geräts.

Obwohl ein privater Gerätekontext praktisch zu verwenden ist, ist er in Bezug auf Systemressourcen speicherintensiv und erfordert 800 oder mehr Bytes für die Speicherung. Private Gerätekontexte werden empfohlen, wenn Leistungsaspekte die Speicherkosten überwiegen.

Das System schließt den privaten Gerätekontext ein, wenn die WM_ERASEBKGND-Nachricht an die Anwendung gesendet wird. Die aktuelle Auswahl des privaten Gerätekontexts, einschließlich des Zuordnungsmodus, wird wirksam, wenn die Anwendung oder das System diese Nachrichten verarbeitet. Um unerwünschte Effekte zu vermeiden, verwendet das System beim Löschen des Hintergrunds logische Koordinaten. Beispielsweise wird die GetClipBox-Funktion verwendet, um die logischen Koordinaten des zu löschenden Bereichs abzurufen und diese Koordinaten an die FillRect-Funktion zu übergeben. Anwendungen, die diese Nachrichten verarbeiten, können ähnliche Techniken verwenden.

Eine Anwendung kann die GetDCEx-Funktion verwenden, um zu erzwingen, dass das System einen allgemeinen Gerätekontext für das Fenster mit einem privaten Gerätekontext zurückgibt. Dies ist nützlich, um schnelle Touchups in einem Fenster durchzuführen, ohne die aktuellen Werte der Attribute des privaten Gerätekontexts zu ändern.