富文本框不允许默认字体大小为11

时间:2014-08-21 17:58:43

标签: vb.net fonts richtextbox rtf

我目前正在组合多个Rich文本对象,以创建一个更大的文档(一个单词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")

Yeilds:

{\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")

Yeilds

{\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所以我真的不确定这是否可能。

对此的任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

我正在努力解决同样的问题。 RTF规范说字体大小(fs)是半个点,这解释了加倍。

另一个观察是,当您将窗体的Font设置为RichTextBox大小为11时,SelectionFont将变为不同的值,这取决于显示器的dpi。如果只设置字体属性,则会在96dpi处创建与120dpi 处不同的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,则返回的字体也将具有此显示相关的字体大小。

最后,如果你想设置一个字体设置为11的空RichTextBox,那么你可能会发现只要用户开始输入,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