IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

changer la couleur de fond de la selection dans une richtextbox


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut changer la couleur de fond de la selection dans une richtextbox
    Bonjour à tous et à toutes,
    j'ai une petite question qui me prend la tête depuis 2 ou 3heures. Je suis en train de réalisé une richtextbox avec colorisation syntaxique. Le problème arrive lorsque je sélectionne un morceau de ma string pour lui changer de couleurs. A ce moment précis on voit le texte se sélectionner, changer de couleurs puis se désélectionner. Voilà j'aimerai savoir si on peut enlever la coloration de sélection ou bien lui changer de couleur.

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Tu as tenté avec Suspend/ResumeLayout ?

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    RichTextBox rtb = new RichTextBox();
    // ....
     
    private void SyntaxHighlight()
    {
        rtb.SuspendLayout();
        // effectue la coloration syntaxique
        rtb.RemuseLayout();
        rtb.Refresh(); // Surement facultatif
    }

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Salut,
    Tu as tenté avec Suspend/ResumeLayout ?

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    RichTextBox rtb = new RichTextBox();
    // ....
     
    private void SyntaxHighlight()
    {
        rtb.SuspendLayout();
        // effectue la coloration syntaxique
        rtb.RemuseLayout();
        rtb.Refresh(); // Surement facultatif
    }
    Ca ne changera rien, ça ne suspend pas le dessin du contrôle mais seulement le calcul de la disposition des contrôles enfants

    Par contre, il serait possible de faire un RichTextBox dont on peut suspendre le dessin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class MyRichTextBox : RichTextBox
    {
        private bool _suspendPaint;
     
        protected override OnPaintBackground(PaintEventArgs e)
        {
            if (!_suspendPaint)
                base.OnPaintBackground(e);
        }
     
        protected override OnPaint(PaintEventArgs e)
        {
            if (!_suspendPaint)
                base.OnPaint(e);
        }
     
        public void SuspendPaint()
        {
            _suspendPaint = true;
        }
     
        public void ResumePaint()
        {
            _suspendPaint = false;
            Invalidate(); // pour forcer le contrôle à se redessiner
        }
    }

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Bonjours,
    Merci d'avoir pris le temps de répondre. J'essaie ça de suite

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Merci encore pour votre aide mais à mon grand regret, cela ne fonctionne pas.

    peut-etre est ce moi qui fait de la m****. Je vais donc vous montrer ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            protected override void OnTextChanged(EventArgs e)
            {
                SuspendPaint();
                 base.OnTextChanged(e);
                _isPaint = false;
     
                paint();
                ResumePaint();
            }
    dans ma methode paint "repaints" les mots.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    tiens, bizarre... apparemment OnPaint n'est jamais appelé

    Voilà une variante qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
        public partial class MyRichTextBox : RichTextBox
        {
            public MyRichTextBox()
            {
                InitializeComponent();
            }
     
            private bool _suspendPaint;
     
            protected override void WndProc(ref Message m)
            {
                // On ignore les messages WM_PAINT si _suspendPaint == true
                if (m.Msg == 0x0f && _suspendPaint)
                    return;
     
                base.WndProc(ref m);
            }
     
            public void SuspendPaint()
            {
                _suspendPaint = true;
            }
     
            public void ResumePaint()
            {
                _suspendPaint = false;
                Invalidate(); // pour forcer le contrôle à se redessiner
            }
        }

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Merci, tu as assuré. Je viens de trouver une autre solution clairement plus sale avec le HideSelection. En fait avant le traitement je donne le focus à l' élément parent, et ensuite je le récupère.

    HideSelection = true;
    Parent.Focus()
    ...
    //traitement
    ...
    this.Focus()
    Par contre peux tu me dire si ce n'est pas trop demandé à quoi sert le WndProc. J'ai regardé sur msnd mais je ne comprend pas bien son fonctionnement.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Folkene Voir le message
    Par contre peux tu me dire si ce n'est pas trop demandé à quoi sert le WndProc. J'ai regardé sur msnd mais je ne comprend pas bien son fonctionnement.
    Sous Windows, chaque contrôle reçoit de l'OS des messages (clic souris, frappe clavier, dessin, etc...) qu'il traite selon sa propre logique. La méthode WndProc est appelée à chaque message reçu pour décider ce qu'on fait pour ce message.

    Dans mon code, j'ai juste géré le cas de l'évènement WM_PAINT (dessin du contrôle) pour qu'il soit ignoré. Dans tous les autres cas, j'appelle l'implémentation de base pour avoir le comportement habituel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer la couleur de sélection d'un Item dans une ListBox
    Par jo_la_pasteque dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 16/04/2014, 16h16
  2. Réponses: 7
    Dernier message: 19/03/2014, 19h42
  3. Réponses: 3
    Dernier message: 26/08/2011, 12h04
  4. Changer la couleur de fond de la case d'une checkBox
    Par antarius73 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/06/2009, 16h25
  5. Changer la couleur de fond de l'écran
    Par tnk dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 19/01/2003, 01h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo