Freigeben über


Interoperabilität zwischen GDI und GDI+

Es ist manchmal wünschenswert, Windows Graphics Device Interface (GDI) und GDI+-Zeichnungsvorgänge im selben Codepfad zu kombinieren. Dieser Artikel enthält Tipps zum Schreiben von Code, mit dem GDI und GDI+ zusammenarbeiten können.

Ursprüngliche Produktversion: Windows-Grafikgerätschnittstelle
Ursprüngliche KB-Nummer: 311221

Zusammenfassung

Bestimmte Regeln gelten beim Mischen von GDI- und GDI+-Code. Sie sollten z. B. keine GDI- und GDI+-Aufrufe bei einem Zielobjekt verflechten. Es ist in Ordnung, ein Grafikobjekt um einen HDC zu kapseln, aber Sie sollten nicht direkt über GDI auf den HDC zugreifen, solange das Grafikobjekt nicht zerstört ist.

Vier primäre Szenarien für die Interoperabilität zwischen GDI und GDI+ werden in diesem Artikel behandelt:

  • Verwenden von GDI auf einem GDI+ Graphics-Objekt, das vom Bildschirm unterstützt wird
  • Verwenden von GDI für ein GDI+ Graphics-Objekt, das von einer Bitmap unterstützt wird
  • Verwenden von GDI+ auf einem GDI HDC
  • Verwenden von GDI+ mit einem GDI-Speicher HBITMAP (eine Kennung für ein Bitmapobjekt)

Verwenden von GDI auf einem GDI+ Graphics-Objekt, das vom Bildschirm unterstützt wird

Ein Beispiel für die Notwendigkeit, GDI in Verbindung mit GDI+ Graphics-Objekten, die auf dem Bildschirm verwendet werden, zu nutzen, wäre das Zeichnen eines Gummibands oder eines Fokusrechtecks. GDI+ unterstützt derzeit keine direkten Rasteroperationen (ROPs), sodass GDI direkt verwendet werden muss, wenn R2_XOR Stiftoperationen erforderlich sind. In diesem Fall würden Sie ein HDC abrufen, indem Sie Graphics::GetHDC() verwenden, an den die GDI-Ausgabe weitergeleitet wird. GDI+-Ausgabe sollte nicht auf dem Graphics-Objekt stattfinden, solange das HDC aktiv ist (d.h., bis Graphics::ReleaseHDC() aufgerufen wird).

Verwenden von GDI für ein GDI+ Graphics-Objekt, das von einer Bitmap unterstützt wird

Wenn Graphics::GetHDC() für ein Grafikobjekt aufgerufen wird, das von einer Bitmap anstelle des Bildschirms unterstützt wird, wird ein Speicher-HDC erstellt und ein neues HBITMAP erstellt und in den Speicher-HDC ausgewählt. Diese neue Speicherbitmap wird nicht mit dem Bild der ursprünglichen Bitmap initialisiert, sondern mit einem Sentinelmuster, das es GDI+ ermöglicht, Änderungen an der Bitmap nachzuverfolgen. Alle Änderungen, die über die Verwendung von GDI-Code an der Speicherbitmap vorgenommen werden, werden in Änderungen am Sentinelmuster sichtbar. Wenn Graphics::ReleaseHDC() aufgerufen wird, werden die Änderungen wieder in die ursprüngliche Bitmap kopiert. Da die Speicherbitmap nicht mit dem Bild der Bitmap initialisiert wird, sollte ein HDC, der auf diese Weise abgerufen wird, nur als Schreibzugriff betrachtet werden und daher nicht für die Verwendung mit ROPs geeignet ist, dies erfordert die Möglichkeit, das Ziel zu lesen, z. B. R2_XOR. Außerdem gibt es einen Leistungsaufwand für diesen Ansatz, da GDI+ die Änderungen wieder in die ursprüngliche Bitmap kopieren muss.

Verwenden von GDI+ auf einem GDI HDC

Sie können die Verwendung von GDI+ auf einem HDC vereinfachen, indem Sie den Grafikkonstruktor verwenden, der eine HDC als Parameter verwendet. Die Zeichnungselemente der Graphics-Klasse können verwendet werden, um auf diese Weise auf das HDC zu zeichnen. Sobald das Graphics-Objekt an die HDC angefügt ist, sollten keine GDI-Vorgänge auf der HDC ausgeführt werden, bis das Graphics-Objekt zerstört oder sich außerhalb des Gültigkeitsbereichs befindet. Wenn die GDI-Ausgabe auf dem HDC erforderlich ist, zerstören Sie entweder das Grafikobjekt, bevor Sie das ursprüngliche HDC verwenden oder Graphics::GetHDC() verwenden, um einen neuen HDC zu erhalten, und befolgen Sie dann die weiter oben in diesem Artikel beschriebenen Regeln für die Interoperabilität, während GDI für ein GDI+ -Objekt verwendet wird.

Verwenden von GDI+ auf einem GDI-Speicher HBITMAP

Der GDI+ Bitmap-Konstruktor, der als Parameter verwendet HBITMAP , verwendet nicht die tatsächliche Quelle HBITMAP als Sicherungsbild für die Bitmap. Stattdessen wird eine Kopie des Bilds im Konstruktor vorgenommen, und Änderungen werden nicht wieder in die ursprüngliche Bitmap geschrieben, auch während der Ausführung des Destruktors. Die neue Bitmap kann als Kopie bei Erstellung betrachtet werden. Um GDI+ auf einen Speicher HBITMAP von GDI zu zeichnen und die Änderungen für HBITMAP anzuwenden, ist stattdessen ein Ansatz wie der folgende erforderlich.

  1. Erstellen Sie eine DIBSection.
  2. Wählen Sie DIBSection in einem Speicher-HDC aus.
  3. Um GDI+ zum Zeichnen zu DIBSectionverwenden, um ein Graphics-Objekt um die HDC zu umschließen.
  4. Um GDI zu verwenden, um in das DIBSection Grafikobjekt zu zeichnen oder daraus zu zeichnen, zerstören Sie das Graphics-Objekt und verwenden Sie das HDC.
  5. Zerstören Sie die Grafikobjekte, und löschen Sie dann die DIBSection Auswahl aus dem HDC. Später kann eine Bitmap aus dem DIBSection erstellt und bei Bedarf in Graphics::DrawImage() als Quellbild verwendet werden.