2012-08-27 6 views
3

J'utilise un RichTextBox dans mon code où je montre un code en surbrillance syntaxique. Maintenant, à chaque frappe, je dois ré-analyser tous les jetons et les re-colorer à nouveau. Mais la seule façon de colorer des mots individuels dans un WinForm richtextbox est de sélectionner ces mots un par un et de les colorier en utilisant SelectionFont.C#: Changement du style de police de WinForm RichTextBox sans sélectionner le texte

Mais si l'utilisateur tape très rapidement, il y a un scintillement très important causé par la sélection de mots individuels (les mots sélectionnés ont cette chose de fond bleu Windows et qui provoque le scintillement). Y a-t-il un moyen de contourner ce point où je peux colorer des mots individuels sans les sélectionner (et par conséquent provoquer une surbrillance bleue autour du texte sélectionné). J'ai essayé d'utiliser SuspendLayout() pour désactiver le rendu pendant ma coloration, mais cela n'a pas aidé. Merci d'avance!

Voici mon code:

code:

private void editBox_TextChanged(object sender, EventArgs e) { 
    syntaxHighlightFromRegex(); 
} 

private void syntaxHighlightFromRegex() {  
    this.editBox.SuspendLayout(); 

    string REG_EX_KEYWORDS = @"\bSELECT\b|\bFROM\b|\bWHERE\b|\bCONTAINS\b|\bIN\b|\bIS\b|\bLIKE\b|\bNONE\b|\bNOT\b|\bNULL\b|\bOR\b"; 
    matchRExpression(this.editBox, REG_EX_KEYWORDS, KeywordsSyntaxHighlightFont, KeywordSyntaxHighlightFontColor); 
} 

private void matchRExpression(RichTextBox textBox, string regexpression, Font font, Color color) { 
    System.Text.RegularExpressions.MatchCollection matches = Regex.Matches(this.editBox.Text, regexpression, RegexOptions.IgnoreCase); 
    foreach (Match match in matches) { 
    textBox.Select(match.Index, match.Length); 
    textBox.SelectionColor = color; 
    textBox.SelectionFont = font; 
    } 
} 

A l'intérieur du MyRichTextBox (dervied de RichTextBox):

public void BeginUpdate() { 
    SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); 
} 
public void EndUpdate() { 
    SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
} 
[DllImport("user32.dll")] 
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
private const int WM_SETREDRAW = 0x0b; 
+0

Curieux: pourquoi ré-analysez-vous TOUT? Pourquoi ne pas simplement analyser ce qui a été tapé et ce qui l'entoure? –

+0

Pourriez-vous montrer le code que vous utilisez pour colorer les mots? Êtes-vous en train de dire que vous sélectionnez par programme des mots et que cela provoque le surlignement bleu? – Anssssss

+1

duplication possible de [coloration de la syntaxe RichTextBox en temps réel - Désactivation de la repeindre] (http://stackoverflow.com/questions/3282384/richtextbox-syntax-highlighting-in-real-time-disabling-the-repaint) –

Répondre

0

Oops se trouve que je suis en utilisant le code Hans correctement. Je devais appeler BeginUpdate() pour arrêter le contrôle du dessin et EndUpdate() pour commencer à le dessiner à nouveau. Je le faisais dans l'autre sens.

Merci pour toute l'aide, tout le monde (surtout Hans)!

1

Même si elle ressemble à vous intégré la syntaxe de Hans texte mettant en lumière boîte, il ne semble pas que vous l'utilisez. Lorsque vous mettez ces mots en surbrillance, vous devez vous souvenir de la position et de la longueur de votre curseur avant de faire la surbrillance, car dans votre code, vous déplacez le curseur et vous ne le remettez pas en place.

Sans vérification d'erreur, essayez de changer votre code à ceci:

void editBox_TextChanged(object sender, EventArgs e) { 
    this.editBox.BeginUpdate(); 
    int lastIndex = editBox.SelectionStart; 
    int lastLength = editBox.SelectionLength; 
    syntaxHighlightFromRegex(); 
    editBox.Select(lastIndex, lastLength); 
    this.editBox.SelectionColor = Color.Black; 
    this.editBox.EndUpdate(); 
    this.editBox.Invalidate(); 
} 
Questions connexes