DIMUSERS
Messages postés37Date d'inscriptionjeudi 8 juin 2006StatutMembreDernière intervention 2 septembre 2010
-
27 févr. 2007 à 21:23
DIMUSERS
Messages postés37Date d'inscriptionjeudi 8 juin 2006StatutMembreDerniè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();
}
}
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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.
DIMUSERS
Messages postés37Date d'inscriptionjeudi 8 juin 2006StatutMembreDerniè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
DIMUSERS
Messages postés37Date d'inscriptionjeudi 8 juin 2006StatutMembreDerniè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
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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.
DIMUSERS
Messages postés37Date d'inscriptionjeudi 8 juin 2006StatutMembreDerniè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
DIMUSERS
Messages postés37Date d'inscriptionjeudi 8 juin 2006StatutMembreDerniè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+