这是在 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。
最佳答案
Anyone know the exact relationship between the string's length and the layout rectangle's width? The number 600581 seems very arbitrary.
数字 600581 确实是任意的,在本例中它反射(reflect)了字体字符宽度(或字体的字形)。
以 600581/65536
为例,它给出的平均字符宽度为每个字符 9.16 像素,当包含间距时,这对于 Arial 等相当方形的字体来说是合理的。除此之外,GDI+ 还向文本的边界框添加填充。
如果您尝试使用更宽的字体(或更窄的字体,但除非减少数量,否则您不会注意到)以及不同的字母组合,您应该会得到不同的结果。尝试使用等宽字体,您应该能够非常准确地预测所需的边界(不要忘记填充)。
如果您确实需要打印长字符串,请尝试缓冲打印,但是在这些情况下,GDI+ 不是您最好的 friend 。按照已经建议的方式尝试使用 TextRenderer
类(GDI 包装器):
http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer.aspx
关于c# - 绘制长度超过 65536 的字符串时 GDI+ DrawString 通用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467663/