그래픽 개체의 상태

Graphics 클래스는 Windows GDI+의 핵심입니다. 아무 것도 그리려면 Graphics 개체를 만들고, 해당 속성을 설정하고, 메서드( DrawLine,DrawImage, DrawString 등)를 호출합니다.

다음 예제에서는 Graphics 개체와 Pen 개체를 생성한 다음 Graphics 개체의 Graphics::D rawRectangle 메서드를 호출합니다.

HDC          hdc;
PAINTSTRUCT  ps;

hdc = BeginPaint(hWnd, &ps);
{
   Graphics graphics(hdc);
   Pen pen(Color(255, 0, 0, 255));  // opaque blue
   graphics.DrawRectangle(&pen, 10, 10, 200, 100);
}
EndPaint(hWnd, &ps);

앞의 코드에서 BeginPaint 메서드는 디바이스 컨텍스트에 대한 핸들을 반환하고 해당 핸들은 그래픽 생성자에 전달됩니다. 디바이스 컨텍스트는 사용 중인 특정 디스플레이 디바이스에 대한 정보를 포함하는 구조체(Windows에서 유지 관리)입니다.

그래픽 상태

Graphics 개체는 DrawLineDrawRectangle과 같은 그리기 메서드를 제공하는 것 이상을 수행합니다. Graphics 개체는 다음 범주로 나눌 수 있는 그래픽 상태도 유지합니다.

  • 디바이스 컨텍스트에 대한 링크
  • 품질 설정
  • 변환
  • 클리핑 영역

디바이스 컨텍스트

애플리케이션 프로그래머로서 Graphics 개체와 해당 디바이스 컨텍스트 간의 상호 작용에 대해 생각할 필요가 없습니다. 이 상호 작용은 백그라운드에서 GDI+에 의해 처리됩니다.

품질 설정

Graphics 개체에는 화면에 그려진 항목의 품질에 영향을 주는 여러 속성이 있습니다. get 및 set 메서드를 호출하여 이러한 속성을 보고 조작할 수 있습니다. 예를 들어 Graphics::SetTextRenderingHint 메서드를 호출하여 텍스트에 적용된 앤티앨리어싱 형식(있는 경우)을 지정할 수 있습니다. 품질에 영향을 주는 다른 집합 메서드는 Graphics::SetSmoothingMode, Graphics::SetCompositingMode, Graphics::SetCompositingQualityGraphics::SetInterpolationMode입니다.

다음 예제에서는 부드러운 모드가 SmoothingModeAntiAlias 로 설정된 타원과 부드러운 모드가 SmoothingModeHighSpeed로 설정된 줄임표를 그리는 예제입니다.

Graphics graphics(hdc);
Pen pen(Color(255, 0, 255, 0));  // opaque green

graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.DrawEllipse(&pen, 0, 0, 200, 100);
graphics.SetSmoothingMode(SmoothingModeHighSpeed);
graphics.DrawEllipse(&pen, 0, 150, 200, 100);

변환

Graphics 개체는 해당 Graphics 개체에서 그린 모든 항목에 적용되는 두 가지 변환(월드 및 페이지)을 유지 관리합니다. 모든 유사 변환은 전역 변환에 저장될 수 있습니다. 유사 변환에는 크기 조정, 회전, 반사, 기울이기 및 변환이 포함됩니다. 페이지 변환은 크기 조정 및 단위 변경(예: 픽셀에서 인치로)에 사용할 수 있습니다. 변환에 대한 자세한 내용은 좌표계 및 변환을 참조하세요.

다음 예제에서는 Graphics 개체의 월드 및 페이지 변환을 설정합니다. 전역 변환은 30도 회전으로 설정되었습니다. 두 번째 Graphics::D rawEllipse 에 전달된 좌표가 픽셀이 아닌 밀리미터로 처리되도록 페이지 변환이 설정됩니다. 이 코드는 Graphics::D rawEllipse 메서드에 대해 두 개의 동일한 호출을 수행합니다. 월드 변환은 첫 번째 Graphics::D rawEllipse 호출에 적용되며 두 번째 Graphics::D rawEllipse 호출에 두 변환(world 및 page)이 모두 적용됩니다.

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0));

graphics.ResetTransform();
graphics.RotateTransform(30.0f);            // World transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);
graphics.SetPageUnit(UnitMillimeter);       // Page transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);

다음 그림은 두 개의 타원을 보여줍니다. 30도 회전은 타원의 중심이 아니라 좌표계의 원점(클라이언트 영역의 왼쪽 상단 모서리)을 기준으로 합니다. 또한 펜 너비 1은 첫 번째 타원의 경우 1픽셀, 두 번째 타원의 경우 1밀리미터를 의미합니다.

작고 얇은 타원과 크고 두꺼운 타원이 포함된 창의 스크린샷

 

클리핑 영역

Graphics 개체는 해당 Graphics 개체에서 그린 모든 항목에 적용되는 클리핑 영역을 유지 관리합니다. SetClip 메서드를 호출하여 클리핑 영역을 설정할 수 있습니다.

다음 예제에서는 두 사각형의 공용 구조체를 형성하여 더하기 모양의 영역을 만듭니다. 해당 지역은 Graphics 개체의 클리핑 영역으로 지정됩니다. 그런 다음 코드는 클리핑 영역의 내부로 제한된 두 줄을 그립니다.

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0), 5);  // opaque red, width 5
SolidBrush brush(Color(255, 180, 255, 255));  // opaque aqua

// Create a plus-shaped region by forming the union of two rectangles.
Region region(Rect(50, 0, 50, 150));
region.Union(Rect(0, 50, 150, 50));
graphics.FillRegion(&brush, &region);

// Set the clipping region.
graphics.SetClip(&region);

// Draw two clipped lines.
graphics.DrawLine(&pen, 0, 30, 150, 160);
graphics.DrawLine(&pen, 40, 20, 190, 150);

다음 그림에서는 잘린 줄을 보여 줍니다.

두 개의 대각선 빨간색 선이 교차하는 색 도형을 보여 주는 그림