【问题标题】:Printing.PaperSize - incorrect width when I get long string form RichTextBox. [vb]Printing.PaperSize - 当我从 RichTextBox 获得长字符串时,宽度不正确。 [vb]
【发布时间】:2015-06-27 02:12:34
【问题描述】:

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

Printing.PaperSize 宽度元素有问题(我必须使用它)。它是 (MSDN)“纸张的宽度,以百分之一英寸为单位”。

我试图从:

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

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

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

当我只有元素的像素大小时,有什么方法可以估计打印宽度(以厘米/英寸为单位)?

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

【问题讨论】:

  • Graphics 对象具有 .DpiX 和 .DpiY 属性:Graphics.DpiX Property。如果这不起作用,您可以打印已知数量的像素并用尺子测量结果。
  • 但是我怎样才能使用'.DpiX'和'RichTextBox'中的'String'呢?如果我尝试使用“DrawToBitmap”,我必须提供适当大小的位图?谢谢你的回答。
  • (打印宽度)=(像素宽度)/(水平分辨率)。 1 英寸 = 25.4 毫米。
  • 我知道,但我仍然不知道如何估计字符串。例如:“lorem ipsum dolor sit amet”的大小(in/cm),其中字体为 Times New Roman 225pt?

标签: vb.net printing richtextbox


【解决方案1】:

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

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?

【讨论】:

  • 谢谢。这正是我所需要的。这个项目还有一个问题 - 如果我不知道前一个元素的大小,是否有任何方法可以让 vb 打印一件又一件的事情?我有问题 - 在我的字符串之后我需要打印下一个,或者从文件中打印 btm 图形。我无法给出打印下一个元素的具体起点。
  • @MarcinGoworek 您应该能够找出所有元素的大小。 .MeasureString 给出了一个 SizeF 结构,它也有一个 .Height 属性。位图也有宽度和高度(以像素为单位)。
  • '.MeasureString' 不精确,当我用它把 gfx 放在字符串后面时,它们太近或太宽(取决于字体)。但是误差不是很大,我认为我可以做到。非常感谢 - 如果没有你的帮助,我永远不会结束这个项目。
  • @MarcinGoworek 不客气 :) 您是否尝试过 g.TextRenderingHint 的任何替代值以查看它们是否提供更好的准确性?
猜你喜欢
  • 2021-05-03
  • 2017-04-11
  • 2011-12-04
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2013-11-04
相关资源
最近更新 更多