2009-05-16 8 views
0

을 사용하여 드로잉 한 후 큰 테두리 상자에 문자열을 그리고 StringFormat을 사용하여 문자열을 적절하게 정렬합니다. 그러나 일단 (MeasureString에 의해 주어진 크기가 아니라) 그려진 문자열의 실제 (X, Y) 위치가 필요합니다.문자열의 위치 결정 WinForms (C#)

나는 아래의 코드를 사용하고 있습니다 :

CharacterRange[] ranges = { new CharacterRange(0, this.Text.Length) }; 
format.SetMeasurableCharacterRanges(ranges); 

//Measure character range 
Region[] region = g.MeasureCharacterRanges(this.Text, this.Font, layoutRect, format); 
RectangleF boundsF = region[0].GetBounds(g); 
bounds = new Rectangle((int)boundsF.Left, (int)boundsF.Top, 
         (int)boundsF.Width, (int)boundsF.Height); 

를이 코드 세그먼트가 너무 누락 선언을 무시합니다. 요점은 위의 코드가 제공하는 사각형이 올바른 크기가 아니며 문자열의 마지막 문자가 삭제되고 첫 번째 문자열 만 그려지는 것입니다.

누구나 알고 계신지, 아니면이 문제를 해결할 더 좋은 방법이 있습니까?

감사

답변

2

텍스트를 측정 할 때 올바른 형식을 사용하고 있는지 확인하십시오. 당신은 전체 소스 코드를 포함하지 않았기 때문에 나는 당신이 누군지 알 수 없다.

사용 가능한 '표준'형식 값은 StringFormat.GenericTypographicStringFormat.GenericDefault입니다. 메모리가 작동하는 경우 선택한 기본 설정은 일반적으로 GenericDefault이지만 UI를 렌더링 할 때 원하는 설정은 GenericTypographic입니다.

따라서 new StringFormat()을 수행하는 대신 StringFormat.GenericTypographic.Clone()을 수행하고 싶습니다. 그러면 여백/간격을 수정하고 Graphics 표면에 렌더링 된 것과 일치하는 측정 결과를 제공해야합니다.

일반적으로 사용하는 전략은 단일 StringFormat 인스턴스를 만들고 텍스트 렌더링과 측정에 모두 사용하여 일렬로 정렬하는 것입니다. 기본값이 아니기 때문에 StringFormat을 생략 할 수있는 방법은 사용하지 않아야합니다. 필요.

희망이 도움이됩니다. 그래도 문제가 해결되지 않으면 더 완벽한 코드 스 니펫을 게시하여 텍스트를 어떻게 페인팅하는지 확인할 수 있습니다.

1

사용 :

이 방법의 추가 오버로드가 있음을
TextBox tb = new TextBox { Text = "Test", Multiline = true }; 
Size size = System.Windows.Forms.TextRenderer.MeasureText(tb.Text, tb.Font); 
Point location = new Point(//Is this what you were looking for? 
    tb.Location.X + size.Width, 
    tb.Location.Y + size.Height); 

참고 확인하시기 바랍니다.

+0

또한 크기와 위치를 조정합니다. – Shimmy

0

동일한 StringFormat 개체를 사용하여 텍스트를 측정하고 그립니다. 내가하고 결국 무엇을

내가 위의 코드를 사용하고있는 TextRenderer 다시 측정하고 내가 기억 아니라 추가 기능이 같이있는 경우 DataGridViewCell에 따라