다각형을 그릴 때는 필요한 좌표들을 배열로 열거하여 그리게 되며, 카디널 곡선을 그릴때도 방법은 사실상 동일하다. 그러나 이것만으로는 특정 영역을 만들어내는 것이 어려우며, 일반 GDI 프로그래밍에서도 곡선을 이용해 영역을 만드는 과정도 쉽지가 않다. 때문에 마스크 이미지를 만들어서 비트맵을 이용한 영역 만들기를 사용한다. 특히 스킨과 다양한 곡선 모양의 윈도우를 지원하는 프로그램을 개발할려면 이런 기법은 아주 당연한것처럼 여겨지고 있으며 GDI+ 에서도 이 기능을 지원하는 것은 물론 더욱 개선된 기능을 제공한다.

경로(Path)

일반 GDI 프로그래밍에서 경로를 지정하는 경우는 선과 도형 그리기에서 꺽인 부분을 어떻게 렌더링할 것인지 결정할 때였으나 GDI+ 에서는 이런 기본적인 경우말고도 다양한 경우에 경로를 지정할 수 있다. 심지어 문자열 그리기도 경로로 지정할 수 있다. 다음은 사각형, 원,문자열을 하나의 경로로 연결하여 그린 예이다.

void CGdiPlusDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 Graphics graphics(dc);
 graphics.SetSmoothingMode(SmoothingModeHighQuality);

 Pen pen(Color(255,0,0,0),3);
 SolidBrush sbrush(Color(255,192,192,192));
 
 GraphicsPath path;
 path.AddRectangle(Rect(10,10,100,100));
 path.AddEllipse(Rect(70,70,120,120));

 FontFamily fontfamily(_T("Arial"));
 path.AddString(_T("Test String"), -1, &fontfamily, FontStyleBold, 48, Point(20,20), NULL);
 path.SetFillMode(FillModeWinding);

// 실제 그리는 코드, 두 개의 함수의 실행순서를 바꾸면 결과가 달라짐에 유의하자.
 graphics.DrawPath(&pen, &path);
 graphics.FillPath(&sbrush, &path);

}

영역(Region)

GDI+의 영역은 Region 클래스로 객체화되어 있으며 사용원리는 일반 GDI 프로그래밍과 같다. 다음 코드는 앞서 작성한 코드가 만든 경로를 하나의 영역으로 만든 후 문자열을 출력하여 일부만 화면에 나오도록 한 예이다.

void CGdiPlusDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 Graphics graphics(dc);
 graphics.SetSmoothingMode(SmoothingModeHighQuality);

 Pen pen(Color(255,0,0,0),3);
 SolidBrush sbrush(Color(255,192,192,192));
 
 GraphicsPath path;
 path.AddRectangle(Rect(10,10,100,100));
 path.AddEllipse(Rect(70,70,120,120));
 FontFamily fontfamily(_T("Arial"));
 path.AddString(_T("Test String"), -1, &fontfamily, FontStyleBold, 48, Point(20,20), NULL);
 path.SetFillMode(FillModeWinding);
 //graphics.FillPath(&sbrush, &path);
 graphics.DrawPath(&pen, &path);


 //GraphicsPath 클래스 객체의 주소를 인자로 Region 클래스 객체를 생성 후 SetClip() 을 사용하면 영역이 설정된다.
 Region Rgn(&path);
 graphics.SetClip(&Rgn);//영역설정

 Font font(_T("Arial"), 100, FontStyleBold, UnitPixel);
 HatchBrush htBrush(HatchStyleDiagonalBrick, Color::Black, Color::Chocolate);

 //높이가 100셀인 문자열을 설정 영역과 겹치는 부분만 출력한다.
 graphics.DrawString(_T("Test String2"), -1, &font, PointF(10,10), &htBrush);

}


만일 두 영역을 합치거나 빼는 등의 연산을 하고 싶다면 적절한 메서드를 사용하면 되는데 다음은 이를 보여주는 코드다.

void CGdiPlusDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 Graphics graphics(dc);
 graphics.SetSmoothingMode(SmoothingModeHighQuality);

 Pen pen(Color(255,0,0,0),3);
 SolidBrush sbrush(Color(255,192,192,192));

 Region Rgn1(Rect(10,10,140,140));
 Region Rgn2(Rect(80,50,140,140));

 //Rgn2.Xor(&Rgn1); //겹치는 부분제외하고 출력
 //Rgn2.Intersect(&Rgn1); //겹치는 부분만 출력
 Rgn2.Exclude(&Rgn1); //빼고 남은 것 출력
 graphics.FillRegion(&sbrush, &Rgn2);

}


'Windows > MFC' 카테고리의 다른 글

GDI+ , 좌표계 변환  (0) 2011.12.13
GDI+ , 글꼴과 문자열 그리기 그리고 출력 형식  (0) 2011.12.13
GDI+ , 외부 이미지 파일의 처리 (Image Class)  (0) 2011.12.13
GDI+ , 브러쉬(Brush)  (0) 2011.12.13
GDI+ , 도형 그리기  (0) 2011.12.13

+ Recent posts