gpt4 book ai didi

vb.net - 富文本框不允许默认字体大小为 11

转载 作者:行者123 更新时间:2023-12-02 05:57:00 27 4
gpt4 key购买 nike

我目前正在组合多个富文本对象,以创建一个更大的文档(Word Doc)。在执行此操作时,我遇到了一个问题,如果我将字体大小设置为 11,则无法正确翻译.Rich Text 包含一个 FS(数字)条目,指示字体大小,然后将其加倍。

(在此示例中,我在分配文本后分配字体大小,这并不重要,并且如果在设置看似全局 FS 属性的之前或之后设置它,则会发生)

Dim masterFont = New System.Drawing.Font("Times New Roman", 11, FontStyle.Regular)
Dim RTB As New RichTextBox
RTB.Font = masterFon
RTB.AppendText("this is the start of a test")

产量:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Times New Roman;}}
\viewkind4\uc1\pard\f0\fs23 this is the start of a test\par
}

在本例中,数字是 23,即 11.5 的两倍,当粘贴时,字体大小果然是 11.5

如果我对 10 或 13 做同样的事情(测试赔率和偶数),它会按预期工作!!

Dim masterFont = New System.Drawing.Font("Times New Roman", 13, FontStyle.Regular)
Dim RTB As New RichTextBox
RTB.Font = masterFont
RTB.AppendText("this is the start of a test")

产量

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Times New Roman;}}
\viewkind4\uc1\pard\f0\fs26 this is the start of a test\par
}

在本例中,字体大小为 26、13 的两倍。

现在,如果我最初将 SelectionFont 属性设置为 MasterFont,它会起作用,但是它将默认字体大小推到底部(添加额外的换行符并可能更改任何包含文档的字体)

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil Times New Roman;}{\f1\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs22 this is the start of a test\b OF BOLD \b0 and this is After bold\f1\fs17\par
}

随着字体大小加倍,这里发生了某种转换,为此我尝试了所有可用图形单元的重载,但没有一个匹配!

现在,如果我执行 RichText.SelectAll(当 RTB 对象准备好粘贴时)并设置选择字体,这可以工作,但是它会覆盖分配给组合段落的格式!

我认为有一种方法可以简单地指定确切的 FS 单位,但是,通过测试图形单位,我没有看到任何 FS11,所以我真的不确定这是否可能。

对此的任何帮助将不胜感激。

最佳答案

我也面临着同样的问题。 RTF 规范规定字体大小 (fs) 为半磅,这解释了双倍的原因。

另一个观察结果是,当您将 Windows 窗体 RichTextBox 的 Font 设置为大小 11 时,SelectionFont 将变为不同的值,这取决于显示器的 dpi。如果您只设置 Font 属性,您将获得以 96dpi 与 120dpi 创建的 RTF 不同的 RTF

以磅为单位的字体大小将转换为像素。每英寸有 72 个点。显示器(或设备上下文)的 dpi 设置表示每英寸有多少像素。

在 120dpi 下,11 号字体 = 11 * 120/72 = 18.333 像素。该值向下舍入为 18 像素。这对应于 18 * 72/120 = 10.8 点的点大小。这是 21.6 个半点,四舍五入为 22。您在 rtf 中得到 fs22。

在 96dpi 下,11 号字体 = 11 * 96/72 = 14.667 像素。四舍五入为 15 像素并反算为 11.25。这是 22.5 个半像素,四舍五入为 23。您在 rtf 中得到 fs23。

如果您向 RTB 的 SelectionChanged 事件添加处理程序,那么您可以看到 SelectionFont.Size 采用与显示相关的字体大小。

我认为您必须更具体,RichTextBox 控件可处理富文本,可以嵌入多种字体、颜色和对象。要附加具有特定字体的文本,请附加文本,然后选择它,然后设置所选内容的字体。不要仅仅依赖于设置 Font 属性。

另一方面,如果显示 Windows 窗体 FontDialog,则返回的字体也将具有此与显示相关的字体大小。

最后,如果您只想设置一个空的 RichTextBox,并将字体设置为 11,那么您可能会发现,一旦用户开始键入,RTF 的大小就会变为 11.5。这是因为您需要设置插入点的字体,而您似乎无法从 .Net 中做到这一点。我已经设法使用 SendMessage 设置插入点,然后设置 SelectionFont 来做到这一点。然后 rtf 将以正确的独立于 dpi 的 fs 值开始:

Dim masterFont As New System.Drawing.Font("Calibri", 11, FontStyle.Regular, GraphicsUnit.Point, 0)
' select insertion point on an empty rtb.
Dim result As IntPtr = SendMessage(RichTextBox1.Handle, &HB1, IntPtr.Zero, New IntPtr(-1))
RichTextBox1.Font = masterFont
RichTextBox1.SelectionFont = masterFont

关于vb.net - 富文本框不允许默认字体大小为 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25432974/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com