c# - propiedades - Richtextbox dibuja una línea rtf
c# rich text box (2)
Quiero agregar una línea horizontal a RichTextBox como un delimitador de mi texto. He encontrado algunos ejemplos de código RTF implementando una línea y los probé de esa manera:
rtbResFile.Rtf = @"{/rtf1{/pard some text./par}{/pard /brdrb /brdrs /brdrw10 /brsp20 /par}{/pard /par}{/pard some other text./par}}";
De esta manera se implementa la creación de un párrafo en blanco con borde, de modo que se vea como una línea. Sin embargo no muestra nada. Sólo un párrafo en blanco. Incluso si trato de implementarlo en la forma de incluir objeto de línea
{/rtf1
{/pard some text./par}
{/pard {/*/do/dobxcolumn/dobypara/dodhgt
/dpline/dpxsize9200/dplinesolid/dplinew30}/par}
{/pard some other text./par}
}
Todavía no muestra nada. ¿RichTextBox soporta esto? ¿O alguna otra forma incluye la línea horizontal en la cadena rtf?
Esta función crea una barra horizontal que es solo una imagen. Para crear esta imagen, simplemente copié una barra horizontal de Visio en un cuadro de texto RTF y luego vi el RTF subyacente. Por lo tanto, es posible insertar cualquier imagen de esta manera.
El siguiente código funciona moviendo el cursor hasta el final del texto, y luego configurando el RTF "seleccionado" para que sea la imagen de barra mencionada anteriormente. El texto se deselecciona.
El código establece que esta barra esté centrada, sin embargo, al establecer centreText
en una cadena vacía (o simplemente eliminando el código), se mantendrá la alineación a la izquierda.
/// <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;
}
Hay algunas formas diferentes de crear una línea horizontal en RTF. Dependiendo del control o programa que se esté utilizando, su kilometraje puede variar. Las implementaciones de RTF en controles y programas tienden a simplemente ignorar el marcado con el que no saben cómo tratar.
Dibujando polígonos:
{/pard{/*/do
/dobxcolumn /dobypara /dodhgt7200
/dpline /dpptx0 /dppty0 /dpptx7200
/dppty0 /dpx0 /dpy0 /dpxsize7200
/dpysize0 /dplinew15
/dplinecor0 /dplinecog0 /dplinecob0 }/par}
Al insertar un párrafo en blanco con un borde seguido de otro párrafo en blanco sin un borde:
{/pard /brdrb /brdrs /brdrw10 /brsp20 /par}
{/pard/par}
Puede cambiar el tamaño y la posición aparente de la línea al establecer sangrías en el párrafo:
{/pard /li2268 /ri567
/brdrb /brdrs /brdrw10 /brsp20 /par}
{/pard/par}
Recomiendo altamente la Guía de bolsillo RTF de O''Reilly para trabajar con estas cosas, que es de donde viene esto.
Algunos experimentos adicionales produjeron el siguiente código, que funciona en WordPad y el control RichTextBox.
{/pict/wmetafile8/picw26/pich26/picwgoal20000/pichgoal15
0100090000035000000000002700000000000400000003010800050000000b0200000000050000
000c0202000200030000001e000400000007010400040000000701040027000000410b2000cc00
010001000000000001000100000000002800000001000000010000000100010000000000000000
000000000000000000000000000000000000000000ffffff00000000ff040000002701ffff0300
00000000
}
Básicamente, consiste en insertar una imagen de 1x1 píxeles de un punto negro y estirarla según sea necesario ajustando los objetivos de altura y anchura. La medida del objetivo está en twips. Un twip se define como 1/1440 de pulgada. Es un hack horrible, pero funciona.