Printing.PaperSize - 当我从 RichTextBox 中获取长字符串时宽度不正确。 [vb]

Printing.PaperSize - incorrect width when I get long string form RichTextBox. [vb]

我项目的一部分是 RichTextBox,字符串长度为 10 到 50 个字符,单行字体大小为 175-225。我使用特殊打印机:100 毫米高和 3000 毫米(3 米)宽色带。非常长的宽度是一个真正的问题。

Printing.PaperSize 宽度元素有问题(我必须使用它)。它是 (MSDN) "The width of the paper, in hundredths of an inch".

我试图从以下位置获取此信息:

RichTextBox1.PreferredSize.Width
g.MeasureString(RichTextBox1.Text, RichTextBox1.Font).Width
g.MeasureCharacterRanges(Text, Font, Rect, Format)

它们都给我 "pixels" 但我不知道如何将它与 Printing.PaperSize 一起使用 - 它们都太短,并且取决于使用的字体系列。

其中棘手的部分是我需要非常精确的 PaperSize 长度,因为我必须在字符串前后打印几个项目。

当我只有元素的像素大小时,有什么方法可以估算打印宽度(在 cm/inches 中)?

如果有人能用 C# 或 C++ 给我任何答案,那没关系 - 我将不胜感激。

您可以测量给定字体中字符串的宽度:

Sub ShowWidthOfText(s As String)
    Using img As New Bitmap(1, 1)
        img.SetResolution(300, 300)

        Using f As New Font("Times New Roman", 225, GraphicsUnit.Point)
            Using g = Graphics.FromImage(img)
                g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
                Dim w = g.MeasureString(s, f)
                MessageBox.Show(String.Format("{0} pixels = {1:N2} cm at {2} ppi", w.Width, w.Width * 2.54 / g.DpiX, g.DpiX))

            End Using
        End Using
    End Using

End Sub

"lorem ipsum dolor sit amet" 在您建议的字体中给出 90.75 厘米(35.73 英寸),这对我来说似乎是合理的。如果您打算从中设置纸张尺寸的宽度,您当然需要至少 3573 百分之一英寸。

如果要使文本适合特定宽度,最好使用逐次逼近法而不是直接计算,因为文本的字距调整可能取决于字体的大小。

如果您使用该代码构建输出,.SetResolution 就在那里,它对测量没有影响。

(.NET 中的分辨率名称是错误的:它们应该是,例如 PpiX 而不是 DpiX 等)

参考:Measure a String without using a Graphics object?