c# - 绘制长度超过 65536 的字符串时 GDI+ DrawString 通用异常?

标签 c# gdi+

这是在 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/

相关文章:

.net - 是否有比 GDI GetPixel() 更快的替代方法?

c++ - 在 GDI+ 中以特定角度绘制字符串时 AntiAlias 失败

c# - 将 JSON 对象 A 转换为 JSON B 对象,其中 B 是 A 的严格子集。两者都由两个 json 模式管理。在 .net 核心中

c# - 无法使用 C# webdriver 单击属于 IFrame 的按钮

c# - NAudio.MmException异常

c# - 我如何从 C# 调用 javascript

c# - 图形对象制作空白图像

c# - 使用 C# 代码将列表选项添加到 Pdfform

c# - 如何在 C# 中访问 GDI+ 效果类

c++ - 需要帮助在 Windows XP 中使用 GDI+ 显示日语文本而不安装东亚语言包