Private Anzeigegerätekontexte
Ein kontextbezogenes privates Gerät ermöglicht es einer Anwendung, das Abrufen und Initialisieren eines Anzeigegerätekontexts jedes Mal, wenn die Anwendung in einem Fenster zeichnen muss, zu vermeiden. Private Gerätekontexte sind nützlich für Fenster, die viele Änderungen an den Werten der Attribute des Gerätekontexts erfordern, um sie für die Zeichnung vorzubereiten. Private Gerätekontexte reduzieren die Zeit, die erforderlich ist, um den Gerätekontext vorzubereiten, und daher die Zeit, die zum Ausführen der Zeichnung im Fenster erforderlich ist.
Eine Anwendung leitet das System an, einen privaten Gerätekontext für ein Fenster zu erstellen, indem die CS_OWNDC Formatvorlage in der Fensterklasse angegeben wird. Das System erstellt jedes Mal einen eindeutigen privaten Gerätekontext, wenn es ein neues Fenster erstellt, das zur Klasse gehört. Zunächst weist der Kontext des privaten Geräts dieselben Standardwerte für Attribute wie einen allgemeinen Gerätekontext auf, die Anwendung kann diese jedoch jederzeit ändern. Das System behält Änderungen am Gerätekontext für die Lebensdauer des Fensters oder bis die Anwendung zusätzliche Änderungen vor.
Eine Anwendung kann mithilfe der GetDC--Funktion jedes Mal, nachdem das Fenster erstellt wurde, ein Handle für den privaten Gerätekontext abrufen. Die Anwendung muss das Handle nur einmal abrufen. Danach kann der 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 freigeben, indem die ReleaseDC--Funktion verwendet wird.
Das System passt den Gerätekontext automatisch an Änderungen am Fenster an, z. B. verschieben oder skalieren. Dadurch wird sichergestellt, dass alle überlappenden Fenster immer richtig abgeschnitten werden. d. h., von der Anwendung ist keine Aktion erforderlich, um den Clipping sicherzustellen. Das System überarbeiten den Gerätekontext jedoch nicht, um den Updatebereich einzuschließen. Daher muss die Anwendung bei der Verarbeitung einer WM_PAINT Nachricht die Aktualisierungsregion entweder durch Aufrufen BeginPaint- oder durch Abrufen des Aktualisierungsbereichs und Durchschneiden mit dem aktuellen Clippingbereich integrieren. Wenn die Anwendung nicht BeginPaint-aufruft, muss sie den Aktualisierungsbereich explizit mithilfe der ValidateRect- oder ValidateRgn-Funktion überprüfen. Wenn die Anwendung den Aktualisierungsbereich nicht überprüft, empfängt das Fenster eine endlose Reihe von WM_PAINT Nachrichten.
Da BeginPaint das Caret ausgeblendet, wenn ein Fenster angezeigt wird, sollte eine Anwendung, die BeginPaint- aufruft, auch die EndPaint--Funktion aufrufen, um das Caret wiederherzustellen. EndPaint hat keine andere Auswirkung auf einen privaten Gerätekontext.
Obwohl ein privater Gerätekontext praktisch zu verwenden ist, ist er speicherintensiv in Bezug auf Systemressourcen, sodass 800 oder mehr Bytes gespeichert werden müssen. Private Gerätekontexte werden empfohlen, wenn Leistungsaspekte die Speicherkosten überwiegen.
Das System enthält den Kontext des privaten Geräts, wenn die WM_ERASEBKGND Nachricht an die Anwendung gesendet wird. Die aktuellen Auswahlen des privaten Gerätekontexts, einschließlich des Zuordnungsmodus, werden wirksam, wenn die Anwendung oder das System diese Meldungen 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 Bereichs abzurufen, um diese Koordinaten zu löschen und 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 zurückgibt, das über einen privaten Gerätekontext verfügt. Dies ist nützlich, um schnelle Touch-Ups in ein Fenster auszuführen, ohne die aktuellen Werte der Attribute des privaten Gerätekontexts zu ändern.