2010-09-14 54 views
5

Tôi muốn tạo một trình soạn thảo đơn giản như Notepad++ với chức năng đơn giản ... Tôi cần tô màu một từ cụ thể trong vùng hộp văn bản có định dạng. Làm thế nào tôi có thể làm điều đó?Làm thế nào để chọn văn bản từ RichTextBox và sau đó tô màu nó?

Ví dụ: khi người dùng viết từ này, tôi muốn tô màu chúng thành màu xanh dương. Những từ này là: for, while, if, try, v.v.

Làm cách nào để làm cho richtextbox chọn một từ cụ thể và sau đó tô màu chúng? Và, nếu tôi muốn đưa ra nhận xét và tô màu mọi thứ sau //, cách đó được thực hiện trong richtextbox như thế nào?

Làm cách nào để đánh số dòng trong hộp văn bản, vì vậy bây giờ tôi có thể là số dòng khi tôi mã hóa trong trình chỉnh sửa của mình?

+0

Điều line-số phải là một câu hỏi riêng biệt (xin vui lòng don câu hỏi 't' stack '). Rất có thể nó sẽ không dễ dàng có thể với 'TextBox' hoặc' RichTextBox'. – Bobby

+0

Hãy thử Hộp văn bản màu nhanh (https://github.com/PavelTorgashov/FastColoredTextBox) nó là nhiều hơn sau đó một cú pháp highlighter –

+0

Thậm chí có sẵn như Nuget (https://www.nuget.org/packages/FCTB/) –

Trả lời

19

Đây là một số mã bạn có thể xây dựng để đạt được chức năng bạn muốn.

private void ColourRrbText(RichTextBox rtb) 
{ 
    Regex regExp = new Regex("\b(For|Next|If|Then)\b"); 

    foreach (Match match in regExp.Matches(rtb.Text)) 
    { 
     rtb.Select(match.Index, match.Length); 
     rtb.SelectionColor = Color.Blue; 
    } 
} 

Bài viết CodeProject Enabling syntax highlighting in a RichTextBox cho biết cách sử dụng RegEx trong RichTextBox để thực hiện đánh dấu cú pháp. Cụ thể, hãy xem SyntaxRichtTextBox.cs để triển khai.

+0

Điều này sẽ làm nổi bật một phần của từ, nếu tôi gõ _Forever_ nó sẽ làm nổi bật ** Đối với ** bao giờ –

+0

@VinodSrivastav: xem mã cập nhật. –

+0

Cảm ơn alex, nhưng do thời gian tôi tìm thấy một workaround 'string kewyords =" Cho | Tiếp theo | Nếu | Sau đó "; kewyords = kewyords.Replace ("|", "\ b | \ b"); ' –

4

Nói chung, bạn phải thực hiện lựa chọn trong RichTextBox. Bạn có thể thao tác vùng chọn hiện tại bằng cách sử dụng phương thức Find hoặc sử dụng các thuộc tính SelectionStartSelectionLength. Sau đó, bạn có thể thay đổi các thuộc tính của văn bản đã chọn bằng cách sử dụng các thuộc tính SelectionXXX. Ví dụ: SelectionColor sẽ đặt màu của lựa chọn hiện tại, v.v. Vì vậy, bạn phải phân tích văn bản trong richtextbox và sau đó chọn một phần văn bản và thay đổi thuộc tính của chúng theo yêu cầu của bạn.

Viết trình chỉnh sửa văn bản tốt bằng RichTextBox có thể khá cồng kềnh. Bạn nên sử dụng một số thư viện như Scintilla cho điều đó. Hãy xem ScintillaNet, một trình bao bọc .NET qua Scintilla.

+0

Tôi sẽ hãy nhìn vào Scintilla. và tôi đã yêu cầu những câu hỏi này kể từ đó, tôi không biết trước rằng có một thư viện có thể làm công việc này và tôi hy vọng nó rất dễ hiểu và làm việc với nó;) – Q8Y

2

Bạn có biết rằng Notepad ++ sử dụng Scintilla không?

Bạn thực sự không phải phát minh lại bánh xe bằng cách đi qua tất cả những rắc rối như có một cổng .NET của Scintilla tên ScintillaNET mà bạn có thể tự do nhúng trong ứng dụng của bạn là trình soạn thảo mã nguồn :)

Nhưng để trả lời câu hỏi của bạn, có vài bộ phận mà bạn cần phải hiểu

  1. tìm những gì để tô màu
  2. Khi tô màu
  3. Làm thế nào để tô màu

  4. Đối với phần đầu tiên, có thể có các cách tiếp cận khác nhau, nhưng tôi nghĩ sử dụng regular expressions sẽ là một lựa chọn tốt. Tôi xin lỗi, nhưng tôi không biết nhiều biểu thức thông thường nên tôi không thể giúp bạn trong trường hợp đó.

  5. Khi màu sắc là rất quan trọng và nếu bạn làm sai, ứng dụng của bạn sẽ bị phạt nặng. Tôi đề nghị bạn tham khảo XPath Visualizer được thực hiện bởi Stack   thành viên tràn của chúng tôi, Cheeso. Hãy xem mã nguồn về cách tô màu của cú pháp. Nhưng nếu bạn ScintillaNET, mọi thứ sẽ được chăm sóc. Dù sao, tôi thực sự dường như không thể tìm thấy tài liệu này, nơi ông rõ ràng cho thấy làm thế nào màu của văn bản đã được thực hiện. Tôi chắc chắn sẽ đăng nó ở đây nếu tôi tìm thấy nó.

  6. Câu hỏi thứ ba tôi nghĩ là được VinayC đài thọ. Nhưng về cơ bản bạn sử dụng SelectionColor cùng với SelectionStart.

+0

Ok, tôi sẽ xem xét Scintilla. và tôi hy vọng rằng nó rất dễ dàng để hiểu nó ... – Q8Y

0

đây là trang web good link on c-sharpcorner.com về tô sáng cú pháp richtextbox cơ bản. Tôi cho rằng bạn và bất kỳ ai truy cập vào trang này cho vấn đề tương tự muốn làm điều đó cho mục đích học tập. Nhưng nếu có ai muốn làm điều đó cho một số làm cho một số IDE cấp comercial thì nó phải sử dụng scintilla hoặc một số tương tự. Cách tiếp cận khác cho việc này là trực tiếp change the RTF of the richtextbox. Nhìn vào codeproject.com có ​​rất nhiều bài báo tương tự như vấn đề này.

0

tôi đã có một số vấn đề với điều đó và đây là giải pháp của tôi, nhịp đập tôi tại sao nó phải được thực hiện như thế này, nhưng nó hoạt động:

  // position on end of control... 
      richTextBox.UpdateLayout(); 
      richTextBox.ScrollToEnd(); 
      richTextBox.UpdateLayout(); 

      // ...then select text and it will be position on top of control. 
      richTextBox.Focus(); 
      richTextBox.Selection.Select(foundRange.Start, foundRange.End); 
      richTextBox.BringIntoView(); 
Các vấn đề liên quan