Was genau wird von einem Grafikkontext (oder Gerätekontext in Windows) gekapselt?
Die verschiedenen Definitionen im Netz stimmen darin überein, dass ein Kontext die Parameter für die verschiedenen Grafikoperationen kapselt. Siehe: X11 , Mac OS , Windows
Es ist nicht klar, ob ein Kontext auch den Speicherpuffer kapselt, auf dem die Grafikoperationen ausgeführt werden.
Im X11-Eintrag werden verschiedene Drawable-Objekte, Window und Pixmap, die die Zeichenflächen darstellen, erwähnt. In der OpenGL GLX -Dokumentation gibt es eine klare Trennung zwischen < em> Renderkontexte und Zeichnungsoberflächen . Interessanterweise wird auch gesagt, dass "Anwendungen in dieselbe Oberfläche rendern können, indem sie verschiedene Kontexte verwenden" und dass "es auch möglich ist, einen einzelnen Kontext zum Rendern in mehrere Oberflächen zu verwenden" >.
Ein X11 GC enthält keinen Speicherpuffer, sowohl Drawable als auch GC werden an alle Zeichenoperationen übergeben, und der GC kann mit allen ähnlichen Drawables verwendet werden (Zeichen auf demselben Bildschirm mit gleicher Bittiefe) ).
Allerdings wird das Zeichnen in X11 heutzutage normalerweise clientseitig mit einer Bibliothek wie Cairo durchgeführt, so dass die "echte" Antwort von dieser Bibliothek abhängt. Im Fall von Kairo enthält der Kairo-Kontext eine aktuelle Zieloberfläche, obwohl Sie die Zieloberfläche ändern können.
OpenGL hat auch ein "aktuelles Ziel" -Konzept, obwohl Sie auch das aktuelle Ziel ändern können.
Wenn Sie verallgemeinern wollen, würde ich sagen, dass ein Kontext konzeptuell vom Puffer getrennt ist. Um jedoch das Schreiben zu ersparen, können Leute einen aktuellen Puffer haben, den Sie für den Kontext setzen können.
Wenn Sie sich speziell einen Windows-Gerätekontext ansehen, scheint die Antwort auf die primäre Frage "Ja und Nein" zu sein.
Ein Gerätekontext erzeugt im Grunde einen Modus, in dem gezeichnet wird - d. h. zu jeder gegebenen Zeit hat er aktuelle Einstellungen für Dinge wie:
(und so weiter für einige weitere Dinge).
Nun, soweit es eine Zeichenfläche gibt: Ja, ich glaube, jeder Gerätekontext hat immer eine Zeichenfläche. Im allgemeinen Fall eines Gerätekontexts für ein Fenster ist diese Zeichenoberfläche der Teil des Bildschirmpuffers, in dem das Fenster angezeigt wird. Im Fall eines "kompatiblen" Gerätekontexts (z. B. Ergebnis von CreateCompatibleDC) wird es eine ziemlich nutzlose Zeichenoberfläche sein, insbesondere ist es ein einzelnes monochromes Pixel. Es wird entweder schwarz oder weiß eingestellt, je nachdem, ob die Gesamthelligkeit von dem, was Sie zum DC zeichnen, einen bestimmten Schwellenwert überschreitet oder nicht (und nein, ich erinnere mich nicht mehr genau an den genauen Schwellenwert).
Dies hat jedoch einen (nützlichen) Zweck: Insbesondere bedeutet es, dass ein DC immer "verwendbar" ist - es gibt nie eine Situation, in der das Zeichnen zu einem DC nur scheitern würde weil es keine Zeichenfläche gibt. Um dies zu erhalten, gibt es keine Funktion DeselectObject
- Sie können SelectObject
verwenden, um eine andere Bitmap in Gerätekontext auszuwählen (die auch die ursprüngliche auswählt), aber es gibt keine Möglichkeit Um eine Bitmap vom Gerätekontext abzuwählen, ohne eine andere auszuwählen - so hat immer eine Zeichenfläche.
Gleichzeitig ist die Standard-Zeichnungsoberfläche für einen kompatiblen Gerätekontext so nahe, dass sie nahezu nutzlos ist, da sie fast gar keine Zeichnungsoberfläche mehr hat.
Bearbeiten: Ich sollte auch hinzufügen, dass die Standard-Zeichenoberfläche, die in einen kompatiblen Gerätekontext ausgewählt wurde, eine Quelle einiger Probleme ist. Insbesondere wenn Sie einen kompatiblen Domänencontroller für doppelt gepuffertes Zeichnen erstellen, müssen Sie Folgendes tun:
%Vor%Wenn Sie jedoch etwas vermasseln und dies stattdessen tun:
%Vor%... alles wird gelingen, und bis zu einem gewissen Grad wird alles funktionieren - nur dass alles, was du über den kompatiblen DC zeichnest, in Monochrom endet. Dies geht auf diese monochrome Ein-Pixel-Bitmap zurück. Da der kompatible DC standardmäßig eine monochrome Bitmap ausgewählt hat, erhalten Sie eine monochrome Bitmap der angegebenen Größe, wenn Sie nach einer kompatiblen Bitmap fragen. In der ersten Version fragen Sie nach einem Bitmap, das mit der Bitmap kompatibel ist, die im ursprünglichen DC ausgewählt wurde. Dies ist normalerweise der Bildschirm, also haben Sie die volle Farbe für Ihren Bildschirm.
Nicht sicher über andere Plattformen, aber unter Windows ist ein Gerätekontext (oder DC) einfach ein undurchsichtiger Zeiger. Die interne Struktur wird von GDI gepflegt und enthält Informationen über Dinge, die auf den Bildschirm gezeichnet werden.
Um die gezeichneten Objekte zu manipulieren, übergeben Sie diesen undurchsichtigen Zeiger (oder Handle ) an GDI-Funktionen. Dies ist das gleiche Konzept wie HWND Griffe, die die Attribute eines Fensters verwalten, außer dass HDC Grafiken verwaltet.