2011-11-30 229 views
16

我想将一条水平线添加到RichTextBox作为我的文本的分隔符。 我发现实现线的RTF代码一些例子,他们试图以这种方式:Richtextbox绘制一条rtf线

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

这种方式实现了创建与边界空白段落,所以这应该看起来像一条线。但它没有显示任何东西。只是一个空白段落。 即使我尝试实现它的方式包括线对象

{\rtf1 
{\pard some text.\par} 
{\pard {\*\do\dobxcolumn\dobypara\dodhgt 
     \dpline\dpxsize9200\dplinesolid\dplinew30}\par} 
{\pard some other text.\par} 
} 

它仍然显示什么。 RichTextBox是否支持这个?或者任何其他方式包括rtf字符串中的水平线?

+0

刚看到这个链接http://msdn.microsoft.com/en-us/library/cc488002.aspx –

回答

13

有几种不同的方法可以在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} 

您可以通过改变positionof行的大小和表观在该段设置缩进:

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

我强烈建议O'Reill y的RTF袖珍指南与这个东西,这是从哪里来的。

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

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

基本上,它涉及到插入一个黑点的1x1像素图像,并根据需要通过调整高度和宽度目标来拉伸它。目标测量值以缇为单位。缇被定义为1/1440英寸。这是一个可怕的黑客,但它的工作。

+0

您是否尝试过在Windows.Forms的RichTextBox的的实现呢?我的问题是致力于在RichTextBox中显示rtf行。我在你的问题中描述了与你相同的方式,但它们不起作用。如果你的工作 - 请为RichTextBox提供一个RTF字符串。 – zooz

+0

@zooz我还没有用RichTextBox控件试过这些。我提供这些的原因是因为我知道他们在其他地方工作,并且与您提供的不一样。从过去使用RichTextBox控件的经验来看,尝试使用多种方法来声明您的预期结果总是值得的,因为它有时候可能会有点怪异。此外,您可以尝试在写字板中创建新的RTF文档,创建布局,然后用记事本打开生成的文档以获取所需的RTF。这通常工作得很好。 – JamieSee

+0

@JamieSee这些解决方案不会为我在OS X TextEdit.App中渲染线条,我认为这是一个全功能的RTF编辑器。你使用哪个编辑器?任何想法为什么我不能在我的编辑器中使用这些命令产生一行? – TeXnewbie

2

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

下面的代码将光标移动到文本的最后,然后将“选定”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(txtActivityLog.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; 
    } 
+0

中工作正常..但它在richtextbox的中心添加了一行,而不是全长。 –

+0

@DeepakRaj - 请参阅'centreText'声明处的注释。只需将其设置为空字符串即可维护现有的文本对齐。此外,对于图像,您可以用任何图像替换上面的图像;为此,请将图像粘贴到Rich Text框中,然后查看RTF代码以确定图像的序列化版本,并在“horizo​​ntalBarRtf”声明中替换该部分。 – CJBS