2

这是一些用 linqpad 编写的 C# 代码,用于重现该问题。

var font = new System.Drawing.Font("Arial", 8);
using (var g = System.Drawing.Graphics.FromHwnd(IntPtr.Zero))
{
    //65536 characters is fine
    g.DrawString("a".PadLeft(65535, 'a'), font, System.Drawing.Brushes.Black, new System.Drawing.RectangleF(0, 0, 1, 1));
    //65537 characters causes an error.
    g.DrawString("a".PadLeft(65536, 'a'), font, System.Drawing.Brushes.Black, new System.Drawing.RectangleF(0, 0, 1, 1));
    //65537 characters is however fine if the width is over 600581
    g.DrawString("a".PadLeft(65536, 'a'), font, System.Drawing.Brushes.Black, new System.Drawing.RectangleF(0, 0, 600582, 1));
}

有人知道字符串的长度和布局矩形的宽度之间的确切关系吗?600581 这个数字似乎很随意。虽然 65536 更有意义,因为它是 0x10000。

4

1 回答 1

2

有人知道字符串的长度和布局矩形的宽度之间的确切关系吗?600581 这个数字似乎很随意。

数字 600581 确实是任意的,在这种情况下,它反映了字体字符宽度(或字体的字形)。

举个例子600581 / 65536,它给出了每个字符 9.16 像素的平均字符宽度,当你包括间距时,这对于像 Arial 这样的相当平方的字体是合理的。除此之外,GDI+ 还为文本的边界框添加了填充。

如果您尝试更宽(或更窄的字体,但除非减少数字,否则您不会注意到)以及不同的字母组合,您应该会得到不同的结果。尝试使用等距字体,您应该能够非常准确地预测所需的边界(不要忘记填充)。

如果您确实需要打印长字符串,请尝试缓冲打印,但是在这些情况下,GDI+ 并不是您最好的朋友。尝试TextRenderer已经建议的类(一个 GDI 包装器):http:
//msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer.aspx

于 2013-01-28T06:42:58.580 回答