1

我正在编写一个在打印字符串时将特殊格式应用于预定关键字的函数。例如,在字符串中 - “为什么这不起作用?” 我可能需要用蓝色下划线打印“为什么”这个词。

我不得不分段实现这一点,用单独的打印调用打印字符串的每一段。这种方法适用于一个问题 - 打印字符串时我无法获得正确的间距。我的关键字打印在以前的默认文本之上,并与之后打印的文本依次重叠。

我正在使用边界矩形将我的字符串放在打印页面上。

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);               
}
4

1 回答 1

1

您没有说您是如何计算将矩形推进多远的-您似乎正在使用字符串的长度,这不起作用,因为这是字符数而不是坐标值。

相反,您应该使用 Graphics.MeasureString 方法来计算打印当前段需要多少空间,并将矩形推进多少。如果您对所有段使用相同的字体,您也可以使用 Graphics.MeasureCharacterRanges 一次性完成所有操作。

顺便说一句,如果您可以选择使用 WPF 而不是 GDI+,那么 TextBlock 类将为您处理所有测量和布局。

于 2009-09-24T21:15:48.740 回答