2012-02-02 7 views
3

기본적으로 서로 다른 문자열을 그 아래에 그릴 수있는 컨트롤을 만들려고합니다. 그러나 문자열의 너비가 컨트롤의 너비보다 클 수 없습니다. 이 문제를 해결하기 위해 RectangleF 객체를 Graphics.DrawString 메서드에 전달하려고합니다. 그것은 전달 된 사각형의 너비보다 넓은 문자열을 래핑합니다. 너무 커지면 전체 문자열을 볼 수 없다는 문제가 해결되지만 다른 문제가 있습니다. 나는이줄 바꿈 된 문자열 측정

Graphics g = e.Graphics; // Paint event 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, 12), someRectangleF); 

뭔가를 시도한다면 문제는 someText 래핑됩니다 경우, 세 번째 줄, 따라서 불가능/하드 읽을 수 있도록 만드는 첫 번째 텍스트의를 통해 텍스트를 그리는 것을 할 것이다.

이 문제에 대한 해결책을 찾고 있었지만 몇 가지 흥미로운 링크를 발견했습니다. 그러나 각 문자의 너비 등을 측정하는 for 루프를 사용했습니다. 이 작업을 수행하는 간단한 방법이 있습니까?

+0

Wrapping으로 TextBlock을 사용하는 것을 고려 했습니까? 빌드하려고하는 컨트롤은 ListView와 매우 비슷합니다. 왜 사용자 정의 컨트롤입니까? – Paparazzi

+0

ListView 사용을 고려했습니다. 그러나 내 컨트롤은 내 프로그램에서 인쇄 할 수있는 시간표를 나타냅니다. 그리고 인쇄 된 ListView는별로 좋아 보이지 않으므로 직접 컨트롤을 만들려고했습니다. 오, 미안 해요. WinForms를 사용하고 있다는 것을 잊어 버렸습니다. 내 질문을 편집했습니다. – haiyyu

답변

5

Graphics.MeasureString 메서드를 사용하여 문자열의 크기를 얻고 그에 따라 다음 문자열을 그릴 수 있습니까?

SizeF size = g.MeasureString(someText, someFont, someRectangleF.Size.Width); 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, size.Height), someRectangleF); 
+0

슬프게도, 나는 그것을 시도했다. MeasureString은 단어 감싸기를 지원하지 않습니다. – haiyyu

+5

문서를 인용 할 때 "width 매개 변수는 반환 된 SizeF 구조체의 너비 구성 요소 최대 값을 지정합니다 (너비). width 매개 변수가 문자열의 실제 너비보다 작 으면 반환 된 너비 구성 요소는 지정된 폭 내에 들어갈 수있는 최대 문자 수를 나타내는 값 전체 문자열을 수용하기 위해 반환 된 높이 구성 요소는 문자 랩으로 문자열을 표시 할 수있는 값으로 조정됩니다. " http://msdn.microsoft.com/en-us/library/9bt8ty58.aspx –

+0

아, 알겠습니다. 나는 실제로 그 페이지를 읽었으며, 나는 그것을 오해 했음에 틀림 없다. 감사! – haiyyu