2009-09-24 6 views
1

문자열을 인쇄 할 때 미리 지정된 키워드에 특별한 서식을 적용하는 함수를 작성했습니다. 예를 들어, 문자열에서 - "왜 작동하지 않습니까?" "왜"라는 단어에 밑줄이 그어져 있고 파란색으로 인쇄해야 할 수도 있습니다.C#으로 프래그먼트 할 때 단일 경계 사각형 내에 여러 문자열 조각을 올바르게 배치하려면 어떻게해야합니까?

인쇄 할 별도의 호출로 문자열의 각 세그먼트를 인쇄하여이를 구현해야했습니다. 이 접근법은 하나의 문제와 함께 작동합니다 - 문자열을 인쇄 할 때 정확한 간격을 얻을 수 없습니다. 내 키워드는 이전 기본 텍스트의 맨 위에 인쇄되며 이후에 인쇄 된 텍스트로 차례로 중복됩니다.

테두리를 사용하여 인쇄 된 페이지에 내 문자열을 배치하고 있습니다.

RectangleF rectKeywordBounds = new RectangleF(60.0, 60.0, 550.0, 1200.0); 

내가 문자열의 세그먼트를 인쇄하면, 내가 그려 문자의 숫자로 사각형의 크기를 수정하고 나는 문자열의 다음 세그먼트를 인쇄 할 수 있습니다.

EArgs.Graphics.DrawString(strFragment, fontBlueItalics, Brushes.Blue, rectKeywordBounds); 
iLastPrintIndex = strFragment.Length + iLastPrintIndex; 

나는 새 문자열 세그먼트의 인쇄 위치 변경하려면이 방법을 사용했습니다 :

rectKeywordBounds = new Rectangle(rectKeywordBounds .X + iLastPrintIndex, rectKeywordBounds .Y, rectKeywordBounds .Width, rectKeywordBounds .Height); 

을 그리고 나는이 하나 사용했습니다 :

properSpacing = new SizeF(-((float)iLastPrintIndex), 0.0f); 
rectKeywordBounds .Inflate(properSpacing); 

두 가지 방법이 결과를 동일한 세그먼트 겹침. 다음 코드는 내가 기대하는 방식으로 경계 사각형을 앞으로 나아가므로 사각형 내에서 텍스트를 인쇄 할 때 개념이 왜 작동하지 않습니까?

Rectangle rectKeywordBounds = new Rectangle(90, 90, 800, 100); 

for (int x = 0; x < 6; x++) 
{ 
    EventArgs.Graphics.DrawRectangle(Pens.BlueViolet, rectKeywordBounds); 
    rectKeywordBounds = new Rectangle(rectKeywordBounds .X + 15, rectKeywordBounds .Y + 200, rectKeywordBounds .Width, rectKeywordBounds .Height);    
} 

답변

1

당신이 계산하는 방법까지 사각형을 진행하는 방법을 말하지 않는다 - 당신은 문자 카운트가 아닌 좌표되는이 작동하지 않습니다 문자열의 길이를 사용하는 것 값.

대신 Graphics.MeasureString 메서드를 사용하여 현재 세그먼트를 인쇄하는 데 필요한 공간을 계산하고 그만큼 사각형을 앞으로 이동시켜야합니다. 모든 세그먼트에 대해 동일한 글꼴을 사용하는 경우 Graphics.MeasureCharacterRanges를 사용하여 한 번에이 작업을 모두 수행 할 수도 있습니다.

그런데 GDI + 대신 WPF를 사용할 수있는 경우 TextBlock 클래스가 모든 측정 및 레이아웃을 처리합니다.

+0

감사합니다. itowlson. 그 트릭을 마쳤습니다! – GFalcon