2010-09-14 5 views
5

Je veux créer un éditeur simple comme Notepad++ avec des fonctionnalités simples ... J'ai besoin de colorer un mot spécifique dans la zone de zone de texte enrichi. Comment puis je faire ça? Par exemple: lorsque l'utilisateur écrit ces mots, je veux les colorier en bleu. Ces mots sont: for, while, if, try, etc.Comment sélectionner du texte dans RichTextBox, puis le colorier?

Comment puis-je faire le richtextbox pour sélectionner un mot spécifique puis les couleurs? Et, si je veux faire un commentaire et tout colorer après le //, comment cela se fait-il dans la riche zone de texte?

Comment puis-je numéroter la ligne dans la zone de texte, donc je peux maintenant le numéro de ligne lorsque je code dans mon éditeur?

+0

La chose numéro de ligne devrait être une question distincte (s'il vous plaît don 't' pile 'questions). Très probablement, ce ne sera pas facilement possible avec 'TextBox' ou' RichTextBox'. – Bobby

+0

Essayez Fast Couleur Zone de texte (https://github.com/PavelTorgashov/FastColoredTextBox) il est plus d'un surligneur de la syntaxe –

+0

Même disponible en tant que Nuget (https://www.nuget.org/packages/FCTB/) –

Répondre

19

Voici un code sur lequel vous pouvez construire afin d'obtenir la fonctionnalité que vous désirez.

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; 
    } 
} 

L'article CodeProject Enabling syntax highlighting in a RichTextBox montre comment utiliser RegEx dans un RichTextBox pour effectuer la mise en évidence de la syntaxe. Plus précisément, regardez le SyntaxRichtTextBox.cs pour la mise en œuvre.

+0

Cela mettra en évidence la partie de mot, si je tape _Forever_ il mettra en évidence ** Pour ** jamais –

+0

@VinodSrivastav: voir le code mis à jour. –

+0

Merci alex, mais au moment où j'ai trouvé une solution de contournement 'chaîne kewyords =" Pour | Suivant | Si | Puis "; kewyords = kewyords.Replace ("|", "\ b | \ b"); ' –

4

En général, vous devez travailler sur la sélection dans RichTextBox. Vous pouvez manipuler la sélection en cours en utilisant la méthode Find ou en utilisant les propriétés SelectionStart et SelectionLength. Vous pouvez ensuite modifier les propriétés du texte sélectionné à l'aide des propriétés SelectionXXX. Par exemple, SelectionColor définirait la couleur de la sélection en cours, etc. Vous devez donc analyser le texte dans richtextbox puis sélectionner une partie des textes et modifier leurs propriétés selon vos besoins.

L'écriture d'un bon éditeur de texte à l'aide de RichTextBox peut être très fastidieuse. Vous devriez utiliser une bibliothèque telle que Scintilla pour cela. Jetez un oeil à ScintillaNet, un wrapper .NET sur Scintilla.

+0

Je vais Jetez un oeil sur Scintilla. et je demandais ces questions depuis, je ne sais pas avant qu'il existe une bibliothèque qui peut faire ce travail et j'espère qu'il est facile de comprendre et de travailler avec elle;) – Q8Y

2

Saviez-vous que Notepad ++ utilise Scintilla?

Vous n'avez pas fait de réinventer la roue en passant par tous les problèmes car il y a un port .NET de Scintilla nommé ScintillaNET que vous pouvez incorporer librement dans votre application comme l'éditeur de code source :)

Mais répondre à votre question, il y a peu de pièces que vous devez comprendre

  1. Trouver quoi la couleur
  2. Quand à la couleur
  3. Comment couleur Pour la première partie, il peut y avoir différentes approches, mais je pense que l'utilisation de regular expressions serait un bon choix. Je suis désolé, mais je ne connais pas beaucoup les expressions régulières, donc je ne peux pas vous aider dans ce cas. Quand est-il crucial de colorier et si vous le faites mal, votre application subira une lourde pénalité de performance. Je vous suggère de vous référer à XPath Visualizer qui a été fait par notre propre membre Stack  , Cheeso. Jetez un oeil à la source sur la façon dont la coloration de la syntaxe a été faite. Mais si vous ScintillaNET, tout serait pris en charge. De toute façon, je n'arrive vraiment pas à trouver cette documentation où il a clairement montré comment la coloration du texte a été faite. Je le posterais certainement ici si je le trouvais.

  4. La troisième question que je pense est couverte par VinayC. Mais fondamentalement, vous utilisez SelectionColor avec SelectionStart.

+0

Ok, je vais jeter un oeil sur Scintilla. et j'espère qu'il est facile de le comprendre ... – Q8Y

0

Voici un site Web good link on c-sharpcorner.com sur la mise en évidence syntaxique de base richtextbox. Je suppose que vous et quiconque visitant cette page pour un problème similaire veulent le faire à des fins d'apprentissage. Mais si quelqu'un veut le faire pour certains faire un peu d'IDE de niveau commercial alors il doit utiliser scintilla ou un similaire. Une autre approche pour cela est de change the RTF of the richtextbox directement. Regardez dans codeproject.com il y a beaucoup d'articles similaires à ce problème.

0

J'ai eu quelques problèmes avec cela et voici ma solution, me bat pourquoi il doit être fait comme ça, mais il fonctionne:

  // 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(); 
Questions connexes