这个让我非常困惑......
我试图在Visual Studio Visual Basic RichTextBox
控件中显示kerned RTF文本(到目前为止在VS2010和VS2012下尝试过)。简单地说,我创建一个Windows窗体项目,向窗体中添加两个RichTextBox
(RichTextBox1
和RichTextBox2
),不更改默认属性,并包含以下VB代码:
Public Class Form1
Private Sub Initialise(sender As System.Object, e As System.EventArgs) Handles Me.Load
Dim txtRTF As String = "{\rtf1\ansi" & _
"{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}" & _
"\f0\pard" & _
"\expndtw-60 a" & _
"\expndtw200 b" & _
"\expndtw-20 c}"
RichTextBox1.Rtf = txtRTF
RichTextBox2.Paste() ' RichTextBox2 formats properly iff clipboard holds ANY valid rtf content
RichTextBox2.Rtf = txtRTF
End Sub
End Class
txtRTF
String
尽可能包含最小有效RTF
标记和文字。
以下是令人困惑的位:尽管RichTextBox1
(展开缇)RTF标记,但\expndtw
中显示的 BUT 文字,RichTextBox2
中显示的文字仍未被记录。 em> 正确kerned,当且仅当剪贴板保存任何有效的RTF内容时(例如,任何文本首先从MS Word文档复制到剪贴板中)。如果剪贴板内容不是RTF格式,则RichTextBox2
中显示的文字不正确剪切。
如果剪贴板不包含RTF格式的数据(或者RichTextBox2.Paste()
代码被删除或注释掉),则运行结果:
如果剪贴板包含任何随机RTF格式的文本,则运行结果:
问题:
RichTextBox2
控件中是否重要RichTextBox2.Rtf
字段?RichTextBox
控件中正确显示kerned文本,而不会首先将随机RTF
格式文本粘贴到其中?答案 0 :(得分:1)
嗯,这需要很多工作!然而,问题现在已经解决了。
事实证明,虽然RTF规范指出\ltrch
(从左到右的字符运行)是默认状态,但似乎RichTextBox
个对象不一定同意。在RTF标记流中包含\ltrch
(或甚至奇怪的,\rtlch
)控制序列完全解决了kern失败问题。通过\expndtwN
和\expndN
的RTF文字字距调整现在效果非常好。无需使用愚蠢的Paste()
命令将RichTextBox
控件预先配置为正确的状态!