Share via


GDI+ フラット API

Windows GDI+ は、Gdiplus.dll に実装され、Gdiplusflat.h で宣言されている約 600 個の関数で構成されるフラット API を公開します。 GDI+ フラット API の関数は、約 40 個の C++ クラスのコレクションによってラップされます。 フラット API で関数を直接呼び出さないことをお勧めします。 GDI+ を呼び出す場合は常に、C++ ラッパーによって提供されるメソッドと関数を呼び出すことで行ってください。 Microsoft 製品サポート サービスは、フラット API を直接呼び出すコードのサポートを提供しません。

C++ ラッパーの代わりに、Microsoft .NET Framework には一連の GDI+ 用のマネージド コード ラッパー クラスが用意されています。 GDI+ のマネージ コード ラッパーは、次の名前空間に属しています。

ラッパーのセット (C++ とマネージド コード) はどちらもオブジェクト指向のアプローチを使用するため、パラメーターをラッパー メソッドに渡す方法と、フラット API の関数にパラメーターを渡す方法にはいくつかの違いがあります。 たとえば、C++ ラッパーの 1 つが Matrix クラスです。 各 Matrix オブジェクトには、GpMatrix 型の内部変数を指すフィールド nativeMatrix があります。 Matrix オブジェクトのメソッドにパラメーターを渡すと、そのメソッドは、GDI+ フラット API の関数の 1 つにこれらのパラメーター (または関連するパラメーターのセット) を渡します。 ただし、そのメソッドは、(入力パラメーターとして) nativeMatrix フィールドをフラット API 関数に渡します。 次のコードは、Matrix::Shear メソッドが GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY, GpMatrixOrder order) 関数を呼び出す方法を示しています。

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

Matrix コンストラクターは、GpMatrix ポインター変数のアドレスを (出力パラメーターとして)GdipCreateMatrix(GpMatrix **matrix) 関数に渡します。 GdipCreateMatrix は、内部 GpMatrix 変数を作成して初期化し、GpMatrix のアドレスをポインター変数に割り当てます。 次に、コンストラクターはポインターの値を nativeMatrix フィールドにコピーします。

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

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

ラッパー クラスの複製メソッドはパラメーターを受け取りませんが、多くの場合、GDI+ フラット API の基になる関数に 2 つのパラメーターを渡します。 たとえば、Matrix::Clone メソッドは、nativeMatrix (入力パラメーターとして) と GpMatrix ポインター変数のアドレス (出力パラメーターとして) を GdipCloneMatrix 関数に渡します。 次のコードは、Matrix::Clone メソッドが GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix) 関数を呼び出す方法を示しています。

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

フラット API の関数は、GpStatus 型の値を返します。 GpStatus 列挙は、ラッパー メソッドで使用される Status 列挙体と同じです。 GdiplusGpStubs.h では、GpStatus は次のように定義されます:

typedef Status GpStatus;

ラッパー クラスのほとんどのメソッドは、メソッドが成功したかどうかを示す状態値を返します。 ただし、ラッパー メソッドの一部は状態値を返します。 状態値を返すラッパー メソッドを呼び出すと、ラッパー メソッドは GDI+ フラット API の基になる関数に適切なパラメーターを渡します。 たとえば、Matrix クラスには Matrix::IsInvertible メソッドがあり、nativeMatrix フィールドと BOOL 変数のアドレス (出力パラメーターとして) を GdipIsMatrixInvertible 関数に渡します。 次のコードは、Matrix::IsInvertible メソッドが GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result) 関数を呼び出す方法を示しています。

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

ラッパーのもう 1 つは Color クラスです。 Color オブジェクトには、DWORD として定義されている ARGB 型の 1 つのフィールドがあります。 いずれかのラッパー メソッドに Color オブジェクトを渡すと、そのメソッドは ARGB フィールドを GDI+ フラット API の基になる関数に渡します。 次のコードは、Pen::SetColor メソッドが GdipSetPenColor(GpPen *pen, ARGB argb) 関数を呼び出す方法を示しています。 Color::GetValue メソッドは、ARGB フィールドの値を返します。

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

次のトピックでは、GDI+ フラット API と C++ ラッパー メソッドの関係を示します。