GDI+는 GDI의 매핑모드와는 비교할 수 없을 정도의 좌표계 변환 기능을 제공하는데, DirectX 라이브러리가 제공하는 수준에 근접하는 정도이다. 따라서 이것을 제대로 이해하고 활용하려면 행렬의 변환과 삼각함수의 지식이 필요하다. 다음은 Matrix 클래스와 Graphics 클래스의 메서드를 이용하여 변환된 좌표계를 활용하여 동일한 사각형을 좌표계를 바꾸어 두 번 그린 예이다.

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

 Pen pen1(Color::Black,3);
 Pen pen2(Color::Red,3);
 Pen penLine(Color::Green, 1);
 penLine.SetDashStyle(DashStyleDot);

 graphics.DrawRectangle(&pen1, 30,30,150,150);

 Matrix transformMatrix;
 transformMatrix.Translate(100.0f,100.0f); //100,100좌표가 0,0이 되도록 변환한다.
 transformMatrix.Rotate(45.0f); //45도 만큼 각도를 회전시킨다.

 graphics.SetTransform(&transformMatrix);
 graphics.DrawLine(&penLine, Point(-200,0), Point(200,0));
 graphics.DrawLine(&penLine, Point(0,-200), Point(0,200));
 graphics.DrawRectangle(&pen2, Rect(30,30,150,150));

}

다음 코드는 Graphics 클래스의 TranslateTransform() 메서드는 기준 좌표를 변경하는 함수이며, RotateTransform() 메서드는 좌표계를 주어진 각도만큼 회전시키는 함수다. 따라서 단순한 2차원 회전 변환이라면 두 함수를 활용하자.


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

 Pen pen1(Color::Black,3);
 Pen pen2(Color::Red,3);
 Pen penLine(Color::Green, 1);
 penLine.SetDashStyle(DashStyleDot);

 graphics.DrawRectangle(&pen1, 30,30,150,150);
 /*
 Matrix transformMatrix;
 transformMatrix.Translate(100.0f,100.0f);
 transformMatrix.Rotate(45.0f);
 */

 graphics.TranslateTransform(100.0f,100.0f);
 graphics.RotateTransform(45.0f);

 //graphics.SetTransform(&transformMatrix);
 graphics.DrawLine(&penLine, Point(-200,0), Point(200,0));
 graphics.DrawLine(&penLine, Point(0,-200), Point(0,200));
 graphics.DrawRectangle(&pen2, Rect(30,30,150,150));

}

+ Recent posts