본문 바로가기
백엔드/C#

c# Graphics로 회전된 글자 그리기

by 1005ptr 2019. 7. 19.
반응형

Geometry 위에 글자를 표시할 일이 생겼다.

글자는 그리기가 어렵다.

 

글자는 기본적으로(g는 Graphics)

g.DrawString(String, Font, Brush, RectangleF, StringFormat);

을 가지고 쓴다.

 

글자의 방향이나 이것저것 고려할것이 없다면 그냥

g.DrawString(String, Font, Brush, x, y);

g.DrawString(String, Font, Brush, x, y, StringFormat);

등을 쓰면된다.

 

문제는 이 Geometry는 회전도 되고 방향도 존재한다.

1. 방향

방향의 경우 StringFormat의 Alignment, StringAlignment 속성을 사용해서 이동할 수 있다.

Alignment: 세로 평면에 대한 텍스트 맞춤 정보를 가져옵니다.

StringAlignment: 가로 평면에 대한 텍스트 맞춤 정보를 가져옵니다.

두 속성에는 StringAlignment라는 enum값이 들어가며 Center, Near, Far 값이 들어있다.

텍스트 레이아웃의 방향에 따라 Near, Far 동작이 바뀌므로 넣어보면서 지정하면 된다.

 

2. 텍스트를 세로로 눕히고 싶은 경우

StringFormat의 FormatFlags 속성을 사용하면 된다.

StringFormatFlags enum을 넣으며 다양한 값이 있는데 이중에 DirectionVertical을 사용하면 된다.

이게 완벽하지는 않은데 PPT에서 지원하는 글자 회전 방식중에 왼쪽것만 표현이 된다.

사실 할 수 있는데 내가 쓰는 방법을 몰라서 못하는 걸 수도 있다.

왼쪽 방식으로만 표현이 된다.

3. 객체가 회전하는 경우

객체가 회전하는 경우 Vertex정보가 있는 사각형, 삼각형, 다각형 등 Polygon의 경우 아래와 같이 현재 Geometry의 회전 중심점(보통 중앙점)을 기준으로 좌표를 회전시켜 g.DrawPolygon, g.FillPolygon 등을 했다.

...더보기

if (this.Degree != 0)

{

        for (int i = 0; i < vertexs.Length; i++)

        {

                PointF pos = vertexs[i];

                vertexs[i] = RotationUtil.RotatePointF(각도, 회전 중심점, pos);

        }

}

하지만 DrawString의 경우 좌표와 선으로만 이루어지지 않고 그릴때 회전값을 넣거나 이런것이 없기 때문에

graphic을 돌려서 글자를 그리고 다시 돌려놓는 방식으로 30도 돌아간 글자 등을 표현해야 한다.

 

처음에는 아래 블로그를 참조해서 작업했는데

TranslateTransform 할 때 넣어주는 x, y값과 DrawString할 때 넣어주는 x, y값이 뭔지 이해를 못해서 포기했다.

샘플코드가 있어서 좀 살펴보면 될것도 같다.

http://csharphelper.com/blog/2014/07/draw-rotated-text-in-c/

 

Draw rotated text in C# - C# Helper

Draw rotated text in C#.

csharphelper.com

그래서 나온 다음 방법은 내가 개발한것은 아니다.

위 방식이랑 같은 느낌이긴 한데 잘 동작하는게 다를 뿐...

...더보기

if (this.Degree != 0)
{
    //회적각이 있는 경우 처리
    Matrix matrixbackup = g.Transform;
    try
    {
        Matrix cmatrix = g.Transform.Clone();
        cmatrix.RotateAt(각도, 회전 중심점);
        g.Transform = cmatrix;
        g.DrawString(텍스트, Font, Brush, RectangleF, StringFormat);
    }
    finally
    {
        g.Transform = matrixbackup;
    }
}

else

{
    g.DrawString(텍스트, FontBrushRectangleF, StringFormat);
}

반응형

댓글