绘制一条rtf线

本文关键字:rtf 一条 绘制 | 更新日期: 2023-09-27 18:16:06

我想添加一个水平线到RichTextBox作为我的文本的分隔符。我找到了一些RTF代码实现一行的例子,并以这种方式进行了尝试:

rtbResFile.Rtf = @"{'rtf1{'pard some text.'par}{'pard 'brdrb 'brdrs 'brdrw10 'brsp20 'par}{'pard 'par}{'pard some other text.'par}}";

这个方法实现了创建一个带边框的空白段落,使其看起来像一条线。然而,它没有显示任何东西。只是一个空白的段落。即使我尝试用include line object

的方式来实现它
{'rtf1
{'pard some text.'par}
{'pard {'*'do'dobxcolumn'dobypara'dodhgt
        'dpline'dpxsize9200'dplinesolid'dplinew30}'par}
{'pard some other text.'par}
}

它仍然没有显示任何东西。RichTextBox支持这个吗?或者其他方法包括rtf字符串中的水平线吗?

绘制一条rtf线

在RTF中创建水平线有几种不同的方法。根据所使用的控制或程序,您的里程可能会有所不同。控件和程序中的RTF实现倾向于简单地忽略它们不知道如何处理的标记。请注意,下面的代码示例是片段,而不是完整的RTF文档。它们需要嵌入到有效的RTF文档中才能工作。

通过绘制多边形:

{'pard{'*'do
'dobxcolumn 'dobypara 'dodhgt7200
'dpline 'dpptx0 'dppty0 'dpptx7200
'dppty0 'dpx0 'dpy0 'dpxsize7200
'dpysize0 'dplinew15
'dplinecor0 'dplinecog0 'dplinecob0 }'par}

插入一个有边框的空白段落,然后插入另一个没有边框的空白段落:

{'pard 'brdrb 'brdrs 'brdrw10 'brsp20 'par}
{'pard'par}

您可以通过在段落上设置缩进来改变行大小和明显位置:

{'pard 'li2268 'ri567
'brdrb 'brdrs 'brdrw10 'brsp20 'par}
{'pard'par}

我强烈推荐O'Reilly的RTF口袋指南来处理这些东西,这就是它的来源。

进一步的实验产生了下面的代码,它在写字板和RichTextBox控件中工作。

{'pict'wmetafile8'picw26'pich26'picwgoal20000'pichgoal15 
0100090000035000000000002700000000000400000003010800050000000b0200000000050000
000c0202000200030000001e000400000007010400040000000701040027000000410b2000cc00
010001000000000001000100000000002800000001000000010000000100010000000000000000
000000000000000000000000000000000000000000ffffff00000000ff040000002701ffff0300
00000000
}

基本上,它涉及插入一个1x1像素的黑点图像,并根据需要通过调整高度和宽度目标来拉伸它。目标测量是在twips。微刃的定义是1/1440英寸。这是一个可怕的黑客,但它有效。

下面是一个例子,最后一个片段放置到一个完整的,有效的RTF文档,正确显示在写字板和视窗窗体的RichTextBox控件:

{'rtf1'ansi'ansicpg1252'deff0'nouicompat'deflang1033{'fonttbl{'f0'fnil'fcharset0 Calibri;}}
{'*'generator Riched20 10.0.19041}'viewkind4'uc1 
'pard'sa200'sl276'slmult1'f0'fs22'lang9 Above'par
{'pict'wmetafile8'picw26'pich26'picwgoal20000'pichgoal15 
0100090000035000000000002700000000000400000003010800050000000b0200000000050000
000c0202000200030000001e000400000007010400040000000701040027000000410b2000cc00
010001000000000001000100000000002800000001000000010000000100010000000000000000
000000000000000000000000000000000000000000ffffff00000000ff040000002701ffff0300
00000000
}
'par
Below'par
}

这个函数创建一个只有图片的水平条。为了创建这张图片,我只是将Visio中的一个水平条复制到一个RTF文本框中,然后查看底层RTF。因此,可以用这种方式插入任何图像。

下面的代码通过将光标移动到文本的最末尾,然后设置& selected&;RTF为前面提到的条形图像。然后取消选中该文本。

代码将此条设置为居中,但是通过将centreText设置为空字符串(或只是删除代码),将保持左对齐。

    /// <summary>
    /// Appends a horizontal bar at the end of the specified Rich Text Box
    /// </summary>
    /// <param name="rtb">Rich Text Box to which horizontal bar is to be added</param>
    private void AppendHorizontalBar(RichTextBox rtb)
    {
        // Position cursor at end of text
        rtb.Select(rtb.TextLength, 0);
        int selStart = rtb.TextLength;
        int selEnd = rtb.TextLength;
        // Textbox may transform chars, so (end-start) != text.Length
        rtb.Select(selStart, selEnd - selStart);
        // This is the RTF section to add.
        string horizontalBarRtf = @"{'pict'wmetafile8'picw12777'pich117'picwgoal7245'pichgoal60 0100090000035b00000004000800000000000400000003010800050000000b0200000000050000000c022100280e030000001e0008000000fa0200000300000000008000040000002d01000007000000fc020100000000000000040000002d010100080000002503020011001100170e110008000000fa0200000000000000000000040000002d01020007000000fc020000ffffff000000040000002d01030004000000f0010000040000002701ffff030000000000}";
        string centreText = "''pard''qc"; // set this to empty string to keep existing text alignment
        // Wrap to-add RTF section in RTF tag
        rtb.SelectedRtf = String.Format("{{''rtf1''ansi''ansicpg1252''deff0''deflang1033''uc1 {0} {1} ''line}}", centreText, horizontalBarRtf);
        // Leave no text selected
        rtb.SelectionLength = 0;
    }