다음을 통해 공유


메타파일(GDI+)

Windows GDI+는 메타파일 을 기록하고 표시할 수 있도록 메타파일 클래스를 제공합니다. 벡터 이미지라고도 하는 메타파일은 그리기 명령 및 설정의 시퀀스로 저장되는 이미지입니다. Metafile 개체에 기록된 명령 및 설정은 메모리에 저장하거나 파일 또는 스트림에 저장할 수 있습니다.

GDI+는 다음 형식으로 저장된 메타파일을 표시할 수 있습니다.

  • WMF(Windows 메타파일 형식)
  • EMF(확장 메타파일)
  • EMF

GDI+는 메타파일을 EMF 및 EMF+ 형식으로 기록하지만, WMF 형식으로는 기록할 수 없습니다.

EMF+는 GDI+ 레코드를 저장할 수 있는 EMF의 확장 버전입니다. EMF+ 형식에는 EMF+ Only과 EMF+ Dual, 두 가지 변형이 있습니다. EMF+ Only 메타파일은 GDI+ 레코드만 포함합니다. 이러한 메타파일은 GDI+에서 표시할 수 있지만 Windows GDI(그래픽 디바이스 인터페이스)는 표시할 수 없습니다. EMF+ Dual 메타파일은 GDI+ 및 GDI 레코드를 포함합니다. EMF+ Dual 메타파일의 각 GDI+ 레코드는 대체 GDI 레코드와 연결됩니다. 이러한 메타데이터는 GDI+ 또는 GDI에서 표시될 수 있습니다.

다음 예제에서는 디스크 파일에 하나의 설정과 하나의 그리기 명령을 기록합니다. 이 예제에서는 Graphics 개체를 만들고 Graphics 개체의 생성자는 Metafile 개체의 주소를 인수로 받습니다.

myMetafile = new Metafile(L"MyDiskFile.emf", hdc);
myGraphics = new Graphics(myMetafile);
   myPen = new Pen(Color(255, 0, 0, 200));
   myGraphics->SetSmoothingMode(SmoothingModeAntiAlias);
   myGraphics->DrawLine(myPen, 0, 0, 60, 40);
delete myGraphics;
delete myPen;
delete myMetafile;

앞의 예제에서 알 수 있듯이 Graphics 클래스는 Metafile 개체에서 명령 및 설정을 기록하는 데 핵심적인 역할을 합니다. Graphics 개체의 메서드에 대한 호출은 Metafile 개체에 기록할 수 있습니다. 마찬가지로 Graphics 개체의 속성을 설정하고 Metafile 개체에 해당 설정을 기록할 수 있습니다. 그래픽 개체가 삭제되거나 scope 종료되면 기록이 종료됩니다.

다음 예제에서는 앞의 예제에서 만든 메타파일을 표시합니다. 메타파일은 왼쪽 상단 모서리가 (100, 100)에 있는 상태로 표시됩니다.

Graphics myGraphics(hdc);
Image myImage(L"MyDiskFile.emf");
myGraphics.DrawImage(&myImage, 100, 100);

다음 예제에서는 Metafile 개체에 여러 속성 설정(클리핑 영역, 월드 변환 및 다듬기 모드)을 기록합니다. 그런 다음 코드는 여러 그리기 명령을 기록합니다. 지침 및 설정은 디스크 파일에 저장됩니다.

myMetafile = new Metafile(L"MyDiskFile2.emf", hdc); 
myGraphics = new Graphics(myMetafile);
   myGraphics->SetSmoothingMode(SmoothingModeAntiAlias);
   myGraphics->RotateTransform(30);

   // Create an elliptical clipping region.
   GraphicsPath myPath;
   myPath.AddEllipse(0, 0, 200, 100);
   Region myRegion(&myPath);
   myGraphics->SetClip(&myRegion);

   Pen myPen(Color(255, 0, 0, 255));
   myGraphics->DrawPath(&myPen, &myPath);

   for(INT j = 0; j <= 300; j += 10)
   {
      myGraphics->DrawLine(&myPen, 0, 0, 300 - j, j);
   }
delete myGraphics;
delete myMetafile;

다음 예제에서는 앞의 예제에서 만든 메타파일 이미지를 표시합니다.

myGraphics = new Graphics(hdc);
myMetafile = new Metafile(L"MyDiskFile.emf");
myGraphics->DrawImage(myMetafile, 10, 10);

다음 그림에서는 이전 코드의 출력을 보여 줍니다. 앤티앨리어싱, 타원형 클리핑 영역 및 30도 회전을 확인합니다.

줄임표 외부의 지점에서 시작되는 선으로 채워진 타원을 포함하는 창의 스크린샷