Richtextbox нарисовать линию RTF - PullRequest
16 голосов
/ 30 ноября 2011

Я хочу добавить горизонтальную линию в 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?

Ответы [ 2 ]

13 голосов
/ 28 декабря 2011

Существует несколько различных способов создания горизонтальной линии в 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}

Я настоятельно рекомендую RTF О'РейлиPocket Guide для работы с этим материалом, откуда он взялся.

В результате дальнейших экспериментов был получен код ниже, который работает в WordPad и элементе управления RichTextBox.

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

В основном,он включает в себя вставку 1x1 пиксельного изображения черной точки и растягивание его по мере необходимости путем корректировки целей высоты и ширины.Цель измерения в два раза.Твип определяется как 1/1440 дюйма.Это ужасный хак, но он работает.

3 голосов
/ 17 февраля 2016

Эта функция создает горизонтальную полосу, это просто картинка.Чтобы создать эту картинку, я просто скопировал горизонтальную полосу из 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;
    }
...