Microsoft富文本框中的文本字距调整

时间:2014-01-12 10:03:08

标签: visual-studio richtextbox rtf text-processing

这个让我非常困惑......

我试图在Visual Studio Visual Basic RichTextBox控件中显示kerned RTF文本(到目前为止在VS2010和VS2012下尝试过)。简单地说,我创建一个Windows窗体项目,向窗体中添加两个RichTextBoxRichTextBox1RichTextBox2),不更改默认属性,并包含以下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()代码被删除或注释掉),则运行结果:

Improper <code>RichTextBox</code> kerning

如果剪贴板包含任何随机RTF格​​式的文本,则运行结果:

Proper <code>RichTextBox</code> kerning

问题:

  1. 为什么在设置之前,我之前将RTF格式(以及非RTF格式)粘贴到RichTextBox2控件中是否重要RichTextBox2.Rtf字段?
  2. 更重要的是,我如何(在VB中)以编程方式在RichTextBox控件中正确显示kerned文本,而不会首先将随机RTF格式文本粘贴到其中?

1 个答案:

答案 0 :(得分:1)

嗯,这需要很多工作!然而,问题现在已经解决了。

事实证明,虽然RTF规范指出\ltrch(从左到右的字符运行)是默认状态,但似乎RichTextBox个对象不一定同意。在RTF标记流中包含\ltrch(或甚至奇怪的,\rtlch)控制序列完全解决了kern失败问题。通过\expndtwN\expndN的RTF文字字距调整现在效果非常好。无需使用愚蠢的Paste()命令将RichTextBox控件预先配置为正确的状态!