2011-11-30 29 views
16

Tôi muốn thêm một dòng ngang vào RichTextBox làm dấu phân tách văn bản của tôi. Tôi đã tìm thấy một số ví dụ mã RTF thực hiện một dòng và cố gắng họ theo cách đó:Richtextbox vẽ đường rtf

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

Bằng cách này thực hiện việc tạo ra một đoạn trống với biên giới, do đó nên trông giống như một đường thẳng. Tuy nhiên nó không hiển thị bất cứ điều gì. Chỉ một đoạn trống. Ngay cả khi tôi cố thực hiện nó theo cách bao gồm đối tượng đường thẳng

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

Nó vẫn không hiển thị gì. RichTextBox có hỗ trợ điều này không? Hoặc bất kỳ cách nào khác bao gồm các đường ngang trong chuỗi rtf?

+0

Chỉ cần xem liên kết này http://msdn.microsoft.com/en-us/library/cc488002.aspx –

Trả lời

13

Có một vài cách khác nhau để tạo một đường ngang trong RTF. Tùy thuộc vào điều khiển hoặc chương trình đang sử dụng số dặm của bạn có thể thay đổi. Triển khai RTF trong các điều khiển và chương trình có xu hướng đơn giản bỏ qua việc đánh dấu mà chúng không biết cách xử lý.

By đa giác vẽ:

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

Bằng cách chèn một đoạn trống với một biên giới tiếp theo là một đoạn trống mà không có một biên giới:

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

Bạn có thể thay đổi kích thước và rõ ràng positionof dòng bởi đặt thụt lề trên đoạn văn:

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

Tôi rất khuyên bạn nên O'Reill Hướng dẫn bỏ túi RTF của y để làm việc với công cụ này, đây là nơi xuất phát của nó.

Một số thử nghiệm tiếp theo đã tạo mã bên dưới, hoạt động trong điều khiển WordPad và RichTextBox.

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

Về cơ bản, nó bao gồm chèn ảnh 1x1 pixel của chấm đen và kéo dài khi cần bằng cách điều chỉnh mục tiêu chiều cao và chiều rộng. Đo lường mục tiêu là trong twips. Một twip được định nghĩa là 1/1440 của một inch. Đó là một hack khủng khiếp, nhưng nó hoạt động.

+0

Bạn đã thử triển khai điều này trong RichTextBox của Windows.Forms chưa? Câu hỏi của tôi đã được dành riêng để hiển thị dòng rtf trong RichTextBox. Tôi đã mô tả những cách tương tự như của bạn trong câu hỏi của tôi, và họ không làm việc. Nếu bạn làm việc - vui lòng cung cấp chuỗi RTF cho RichTextBox. – zooz

+0

@zooz Tôi đã không thử những điều này với một điều khiển RichTextBox. Lý do tôi cung cấp những lý do này là vì tôi biết họ làm việc ở nơi khác và không hoàn toàn giống với những gì bạn đã cung cấp.Từ kinh nghiệm trong quá khứ với kiểm soát RichTextBox, nó luôn luôn trả tiền để thử nhiều hơn một cách khai báo kết quả dự định của bạn, bởi vì nó có thể là một chút persnickety ở lần. Ngoài ra, bạn có thể thử tạo một tài liệu RTF mới trong Wordpad, tạo bố cục, sau đó mở tài liệu kết quả bằng Notepad để lấy RTF bạn cần. Điều đó thường hoạt động khá tốt. – JamieSee

+0

@JamieXem các giải pháp này sẽ không hiển thị dòng cho tôi trong OS X TextEdit.App mà tôi đã nghĩ là một trình soạn thảo RTF đầy đủ tính năng. Bạn sử dụng trình chỉnh sửa nào? Bất kỳ ý tưởng tại sao tôi không thể tạo ra một dòng với các lệnh này trong trình soạn thảo của tôi? – TeXnewbie

2

Chức năng này tạo ra một thanh ngang chỉ là một hình ảnh. Để tạo ra hình ảnh này, tôi chỉ cần sao chép một thanh ngang từ Visio vào một hộp văn bản RTF, và sau đó xem RTF cơ bản. Do đó, có thể chèn bất kỳ hình ảnh nào theo cách này.

Mã bên dưới hoạt động bằng cách di chuyển con trỏ đến cuối văn bản, sau đó đặt RTF "được chọn" làm hình ảnh thanh nói trên. Văn bản sau đó không được chọn.

Mã đặt thanh này làm trung tâm, tuy nhiên bằng cách đặt centreText thành chuỗi rỗng (hoặc chỉ cần xóa mã), căn chỉnh trái sẽ được duy trì.

/// <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

hoạt động tốt .. nhưng nó thêm dòng ở trung tâm của richtextbox, không đầy đủ chiều dài. –

+0

@DeepakRaj - Xem nhận xét khi khai báo 'centreText'. Chỉ cần đặt chuỗi đó thành một chuỗi trống để duy trì văn bản hiện tại. Ngoài ra, đối với hình ảnh, bạn có thể thay thế hình ảnh ở trên bằng bất kỳ hình ảnh nào; để làm như vậy, hãy dán một hình ảnh vào hộp Văn bản có dạng thức, sau đó xem mã RTF để xác định phiên bản được nối tiếp của hình ảnh và thay thế phần đó trong khai báo 'horizontalBarRtf'. – CJBS