Mon rectangle ne se retrace pas sur ma RichTextBox

Résolu
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010 - 27 févr. 2007 à 21:23
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010 - 1 mars 2007 à 20:38
Bonjour,
Ma question doit être bête, mais on dit qu'il vaut mieux un qui sait que dix qui cherchent. Alors voilà :
J'ai une form (voir le code plus bas). Sur cette form une RichTextBox. Dans cette RichTextBox sur un évennement clic, je trace un rectangle.
Jusque là tout vas bien, le rectangle se trace. Mais si je minimise ma form puis que je la maximise, alors le rectangle disparait. J'ai pourtant rajoutté un traitement de l'évennement OnPaint et un traitement de l'évennement OnResize dans lesquels je rappelle ma fonction (TraceRectangle) qui devrait me retracer mon rectangle.
Quelqu'un pourrait-il me dire ce que je fais mal ? 
Merci d'avance.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        protected override void OnResize(EventArgs e)
        {
            TraceRectangle();
            base.OnResize(e);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            TraceRectangle();
            base.OnPaint(e);          
        }
        private void Form1_Click(object sender, EventArgs a)
        {
            TraceRectangle();
        }
        private void TraceRectangle()
        {
            Graphics g;
            g = richTextBox1.CreateGraphics();
            Pen Stylo = new Pen(new SolidBrush(Color.Black));
            Rectangle Rectangle = new Rectangle(10, 10, 40, 50);
            g.DrawRectangle(Stylo, Rectangle);
            g.Dispose();
        }
    }

8 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 févr. 2007 à 18:32
WndProc est l'equivalent de WindowProc en Win32.. puisque c'est une méthode virtuelle qu'on override on reçoit bien tous les messages du système d'exploitation avant le traitement par défaut, c'est pour ça que dans l'exemple la case 'defaut' renvoie tous les messages qu ne nous interesses pas à base.WndProc.
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
28 févr. 2007 à 09:40
en fait... je pense que le RichTextBox se redessine après le OnPaint de la form. Donc, c'est effacé.

Il faut que tu interceptes le message WM_PAINT du RichTextBox pour intervenir après.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010
28 févr. 2007 à 12:56
Merci de ta réponse,
Malheureusement ton conseil ne corrige pas le comportement.
J'avais aussi essayé de dériver ma RTBox et de travailler dans son OnPaint plutôt que dans le OnPaint de la form. Cet évennement ne semble pas appelé. Ce qui semble être corroboré par un post que j'ai trouvé dans un forum indiquant qu'au cas par cas (sic), les contrôles étaient redessinés par eux mêmes ou par la form parente.
Je suis preneur de tout autre suggestion.
E. Laplane
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
28 févr. 2007 à 13:15
Voici une source qui te montre comment faire : http://www.csharpfr.com/codes/AFFICHER-NUMERO-LIGNES-RICHTEXTBOX_31328.aspx

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010
28 févr. 2007 à 16:51
Merci, ton conseil à porté ses fruits. voici quelques conclusions un peu mystérieuses pour moi.
Voilà ce que j'avais essayé (ne marche pas )
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;


namespace RTB01
{
    public class UserControl1 : RichTextBox
    {
        public UserControl1()
        {
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            TraceRectangle();
        }
        public void TraceRectangle()
        {
            Graphics g;
            g = this.CreateGraphics();
            Pen Stylo = new Pen(new SolidBrush(Color.Black));
            Rectangle Rectangle = new Rectangle(10, 10, 40, 50);
            g.DrawRectangle(Stylo, Rectangle);
            g.Dispose();
        }
    }
}
Et voici ce que fait FABFO dans son exemple (marche)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;


namespace RTB01
{
    public class UserControl1 : RichTextBox
    {
        public UserControl1()
        {
        }
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 0xF:
                    // Surcharge la méthode Paint par les APIs
                    base.WndProc(ref m);
                    TraceRectangle();
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }
        public void TraceRectangle()
        {
            Graphics g;
            g = this.CreateGraphics();
            Pen Stylo = new Pen(new SolidBrush(Color.Black));
            Rectangle Rectangle = new Rectangle(10, 10, 40, 50);
            g.DrawRectangle(Stylo, Rectangle);
            g.Dispose();
        }
    }
}

Conclusion : Il n'est pas équivalent de dérouter un message onPaint (override OnPaint) ou de dérouter la totalité de la pompe à messages (override WndProc) pour y traiter le message OnPaint. Pour moi, c'est une énigme. Si quelqu'un y pige quelquechose, il est le bienvenue sur ce thread.
Merci à tous


 
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 févr. 2007 à 17:30
Salut, c'est Windows qui dessine directement la RichTextBox,  met une MessageBox dans l'ovveride de OnPaint tu verras qu'elle n'est jamais appellée, pour ça faudrait passer le bit UserPaint à true mais on perd la peinture par défaut ce qui pose d'autres problèmes.
0
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010
28 févr. 2007 à 18:05
J'avais effectivement fait l'expérience de la message box (en fait Debug.Print qui pose moins de problèmes dans un handler d'évennement). Mais si je comprends bien ce que tu m'expliques lorsqu'on override wndproc pour un composant en particulier (ici la RTB) en fait on reroute la file entière de message Windows, ce qui sinifierait que l'ensemble des message de l'OS passent par cette fonction overridée. Il ne me semble pas constater celà. Es-tu vraiment sûr, ou ai-je mal compris ta réponse ?
E. Laplane
0
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010
1 mars 2007 à 20:38
Merci encore à tous,
J'ai bien ramé, mais j'ai appris aussi quelquechose d'interessant. Plus généralement, je trouve que Microsoft a fait beaucoup d'effort pour masquer à la fois le système de message et les dll, mais il me semble encore impossible d'écrire une application sans ces eux (Messages et Interrop).
A+
0
Rejoignez-nous