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+의 관리 코드 래퍼는 다음 네임스페이스에 속합니다.

  • system.Drawing
  • System.Drawing.Drawing2D
  • system.Drawing.Imaging
  • System.Drawing.Text

두 래퍼 집합(C++ 및 관리 코드)은 모두 개체 지향 접근 방식을 사용하므로 매개 변수가 래퍼 메서드에 전달되는 방식과 플랫 API의 함수에 매개 변수가 전달되는 방식 사이에는 몇 가지 차이점이 있습니다. 예를 들어 C++ 래퍼 중 하나는 Matrix 클래스입니다. 각 Matrix 개체에는 GpMatrix형식의 내부 변수를 가리키는 nativeMatrix 필드가 있습니다. Matrix 개체의 메서드에 매개 변수를 전달하면 해당 메서드는 해당 매개 변수(또는 관련 매개 변수 집합)를 GDI+ 플랫 API의 함수 중 하나에 전달합니다. 그러나 이 메서드는 nativeMatrix 필드(입력 매개 변수로)를 플랫 API 함수에 전달합니다. 다음 코드는 Matrix::Shear 메서드가 GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY, GpMatrixOrder 순서) 함수를 호출하는 방법을 보여 줍니다.

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

행렬 생성자는 GdipCreateMatrix(GpMatrix **matrix) 함수에 GpMatrix 포인터 변수의 주소를 출력 매개 변수로 전달합니다. GdipCreateMatrix 내부 GpMatrix 변수를 만들고 초기화한 다음 GpMatrix 주소를 포인터 변수에 할당합니다. 그런 다음 생성자는 포인터 값을 nativeMatrix 필드에 복사합니다.

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

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

래퍼 클래스의 복제 메서드는 매개 변수를 받지 않지만 GDI+ 플랫 API의 기본 함수에 두 개의 매개 변수를 전달하는 경우가 많습니다. 예를 들어 Matrix::Clone 메서드는 GdipCloneMatrix 함수에 nativeMatrix(입력 매개 변수로) 및 GpMatrix 포인터 변수의 주소를 출력 매개 변수로 전달합니다. 다음 코드는 Matrix::Clone 메서드가 GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix) 함수를 호출하는 방법을 보여 줍니다.

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

플랫 API의 함수는 GpStatus 형식의 값을 반환합니다. GpStatus 열거형은 래퍼 메서드에서 사용하는 상태 열거형과 동일합니다. GdiplusGpStubs.h에서 GpStatus는 다음과 같이 정의됩니다.

typedef Status GpStatus;

래퍼 클래스의 대부분의 메서드는 메서드가 성공했는지 여부를 나타내는 상태 값을 반환합니다. 그러나 일부 래퍼 메서드는 상태 값을 반환합니다. 상태 값을 반환하는 래퍼 메서드를 호출할 때 래퍼 메서드는 GDI+ 플랫 API의 기본 함수에 적절한 매개 변수를 전달합니다. 예를 들어 Matrix 클래스에는 nativeMatrix 필드와 BOOL 변수의 주소(출력 매개 변수)를 GdipIsMatrixInvertible 함수에 전달하는 Matrix::IsInvertible 메서드가 있습니다. 다음 코드는 Matrix::IsInvertible 메서드가 GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result) 함수를 호출하는 방법을 보여 줍니다.

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

래퍼 중 하나는 Color 클래스입니다. Color 개체에는 DWORD정의된 ARGB 형식의 단일 필드가 있습니다. 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++ 래퍼 메서드 간의 관계를 보여 줍니다.