창밖에서 흔적남기기

관악구 신림8동.. 전철역에서 10분 걸어 이곳 6층. 꼭대기 층이고 하나뿐이 창문과 이 창문의 잘못된 방향으로 여름엔 사우나가 따로 없는 이곳을 내 임시 거처로 마련한지… 이제 1년하고도 6개월이나 되었다. 이제 몇달 후면 본래의 주인에게 이곳을 넘기고 다른 곳으로 옮긴다는 생각이 문득 들어… 창밖의 야경을 기록으로 남긴다.

운치가 한껏 느껴지지 못하는 야경이지만 가끔 답답한 마음을 달래려 창문을 열면 늘 나를 마지해주는 풍경이다. 폼 잡고서 담배 한대 물고서 하얀 연기 속의 고독과 상념에 빠져야 삶의 멋일진데…. 아쉽게도 나는 담배의 맛을 모른다…

GDI+에서 화면에 표시될 String(문자, Text)의 정확한 Width(폭) 구하기

GDI+에서 graphics의 MeasureString 함수를 통해 출력된 문자열의 폭을 구해보면 기대했던 폭 보다 다소 넓게 구해진다. MeasureString 보다 훨씬 정확한 폭을 구하는 방법에 대한 코드이다.

static public int MeasureDisplayStringWidth(Graphics graphics,
    string text, Font font)
{
    System.Drawing.StringFormat format = 
        new System.Drawing.StringFormat();

    System.Drawing.RectangleF rect = 
        new System.Drawing.RectangleF(0, 0, 1000, 1000);

    System.Drawing.CharacterRange[] ranges  = { 
        new System.Drawing.CharacterRange0,text.Length) 
    };

    System.Drawing.Region[] regions = new System.Drawing.Region[1];

    format.SetMeasurableCharacterRanges(ranges);

    regions = graphics.MeasureCharacterRanges(text, font, rect, format);
    rect = regions[0].GetBounds(graphics);

    return (int)(rect.Right + 1.0f);
}
옮겨온 곳 : Code Project, Pierre Arnaud의 글

 

참고로, 이 방법을 알기 전에는 필자는 String에 대한 Path를 만든 후, 즉 GraphicsPath를 만들고  GetBounds 매서드를 통해 크기를 얻었다. 하지만 이 방법은 MeasureString에 비해 정확하기는 하지만 역시 다소 부정확하다. 하지만 여전이 실제 프로젝트 적용에 대해서는 Path를 이용한 방법을 사용하고 있다.