GDI+ Flache API

Windows GDI+ macht eine flache API verfügbar, die aus ca. 600 Funktionen besteht, die in Gdiplus.dll implementiert und in Gdiplusflat.h deklariert sind. Die Funktionen in der GDI+-Flach-API werden durch eine Auflistung von ca. 40 C++-Klassen umschlossen. Es wird empfohlen, die Funktionen in der flachen API nicht direkt aufzurufen. Wenn Sie Aufrufe an GDI+ tätigen, sollten Sie dies tun, indem Sie die Methoden und Funktionen aufrufen, die von den C++-Wrappern bereitgestellt werden. Microsoft-Produktsupportdienste bieten keine Unterstützung für Code, der die flache API direkt aufruft.

Als Alternative zu den C++-Wrappern stellt Microsoft .NET Framework eine Reihe von Wrapperklassen mit verwaltetem Code für GDI+ bereit. Die Wrapper für verwalteten Code für GDI+ gehören zu den folgenden Namespaces.

Beide Wrappergruppen (C++ und verwalteter Code) verwenden einen objektorientierten Ansatz. Daher gibt es einige Unterschiede zwischen der Art und Weise, wie Parameter an die Wrappermethoden übergeben werden, und die Art und Weise, wie Parameter an Funktionen in der flachen API übergeben werden. Beispielsweise ist einer der C++-Wrapper die Matrix Klasse. Jedes Matrix--Objekt weist ein Feld nativeMatrix-auf, das auf eine interne Variable vom Typ GpMatrix-verweist. Wenn Sie Parameter an eine Methode eines Matrix-Objekts übergeben, übergibt diese Methode diese Parameter (oder eine Reihe verwandter Parameter) an eine der Funktionen in der GDI+-flachen API. Diese Methode übergibt jedoch auch das nativeMatrix--Feld (als Eingabeparameter) an die flache API-Funktion. Der folgende Code zeigt, wie die Matrix::Shear-Methode die GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY, GpMatrixOrder order) Funktion aufruft.

Status Shear(
      IN REAL shearX, 
      IN REAL shearY,
      IN MatrixOrder order = MatrixOrderPrepend)
{
   ...
   GdipShearMatrix(nativeMatrix, shearX, shearY, order);
   ...
}

Die Matrix-Konstruktoren übergeben die Adresse einer GpMatrix- Zeigervariablen (als Ausgabeparameter) an die GdipCreateMatrix(GpMatrix **matrix) Funktion. GdipCreateMatrix erstellt und initialisiert eine interne GpMatrix- Variable und weist dann die Adresse der GpMatrix- der Zeigervariablen zu. Anschließend kopiert der Konstruktor den Wert des Zeigers in das nativeMatrix Feld.

Matrix()
{
   GpMatrix *matrix = NULL;
   lastResult = DllExports::GdipCreateMatrix(&matrix);
   SetNativeMatrix(matrix);
}

VOID SetNativeMatrix(GpMatrix *nativeMatrix)
{
   this->nativeMatrix = nativeMatrix;
}

Klonmethoden in den Wrapperklassen erhalten keine Parameter, übergeben jedoch häufig zwei Parameter an die zugrunde liegende Funktion in der GDI+-flachen API. Beispielsweise übergibt die Matrix::Clone-Methode nativeMatrix- (als Eingabeparameter) und die Adresse einer GpMatrix- Zeigervariable (als Ausgabeparameter) an die GdipCloneMatrix- Funktion. Der folgende Code zeigt, wie die Matrix::Clone-Methode die GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix) Funktion aufruft.

Matrix *Clone() const
{
   GpMatrix *cloneMatrix = NULL;
   ...
   GdipCloneMatrix(nativeMatrix, &cloneMatrix));
   ...
   return new Matrix(cloneMatrix);
 }

Die Funktionen in der flachen API geben einen Wert vom Typ "GpStatus" zurück. Die GpStatus-Aufzählung ist identisch mit der Status Enumeration, die von den Wrappermethoden verwendet wird. In GdiplusGpStubs.h wird GpStatus wie folgt definiert:

typedef Status GpStatus;

Die meisten Methoden in den Wrapperklassen geben einen Statuswert zurück, der angibt, ob die Methode erfolgreich war. Einige der Wrappermethoden geben jedoch Zustandswerte zurück. Wenn Sie eine Wrappermethode aufrufen, die einen Zustandswert zurückgibt, übergibt die Wrappermethode die entsprechenden Parameter an die zugrunde liegende Funktion in der GDI+-flachen API. Die Matrix-Klasse verfügt beispielsweise über eine Matrix::IsInvertible-Methode , die das systemeigeneMatrix-Feld und die Adresse einer BOOL-Variablen (als Ausgabeparameter) an die GdipIsMatrixInvertible-Funktion übergibt. Der folgende Code zeigt, wie die Matrix::IsInvertible-Methode die GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result) Funktion aufruft.

BOOL IsInvertible() const
{
   BOOL result = FALSE;
   ...
   GdipIsMatrixInvertible(nativeMatrix, &result);
   return result;
}

Eine weitere der Wrapper ist die klasse Color. Ein Color-Objekt weist ein einzelnes Feld vom Typ ARGBauf, das als DWORD-definiert ist. Wenn Sie ein Color-Objekt an eine der Wrappermethoden übergeben, übergibt diese Methode das ARGB--Feld an die zugrunde liegende Funktion in der GDI+-flachen API. Der folgende Code zeigt, wie die Pen::SetColor-Methode die GdipSetPenColor(GpPen *pen, ARGB argb) Funktion aufruft. Die Color::GetValue--Methode gibt den Wert des ARGB--Felds zurück.

Status SetColor(IN const Color& color)
{
   ...
   GdipSetPenColor(nativePen, color.GetValue());
}

Die folgenden Themen zeigen die Beziehung zwischen der GDI+-flachen API und den C++-Wrappermethoden.