Mon premier code de GDI+ : 3 lignes toutes bêtes qui ne marchent pas

chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007 - 8 mai 2005 à 17:31
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007 - 11 mai 2005 à 21:07
Salut, je m'initie au GDI+ et j'essaie des petits codes tous bêtes mais
je n'arrive pas à faire marcher celui là. Pas de bug à la compilation
mais rien ne s'affiche dans ma fenêtre Mainform, elle reste blanche.
Qu'ai-je oublié ?



public class MainForm : System.Windows.Forms.Form

{

public MainForm()

{

InitializeComponent();



Rectangle rect = new Rectangle(30,70,100,60);

SolidBrush sb = new SolidBrush(Color.Red);

Graphics g = this.CreateGraphics();



g.FillRectangle(sb,rect);

sb.Dispose();

g.Dispose();

this.Show();



}



[STAThread]

public static void Main(string[] args)

{

Application.Run(new MainForm());

}

18 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 mai 2005 à 17:46
Salut,

Les dessins effectués ne sont pas persistant, c'est à dire que tu es en charge de leur affichage a chaque rafraichissement de la zone sur laquelle ils sont.
De plus dans le constructeur le Form n'est aps encore affiché, donc en gros tu dessines dans le vide là.

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
8 mai 2005 à 17:55
Tu peux overrider la méthode OnPaint et y placer ce bout de code


Mx
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
8 mai 2005 à 18:23
Ne sachant pas ce que overrider la méthode OnPaint signifie
(d'ailleurs, qu'est-ce que ça signifie ?), j'ai juste placé this.show
avant de créer mes graphiques comme l'a suggéré coq et ça a marché.
Donc merci, mais malgré tout, qu'est-ce que la méthode OnPaint ?
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
8 mai 2005 à 18:31
OnPaint est une méthode qui est appelée a chaque raffraichissement de la fenetre

Donc en gros, il faudrait que tu tapes ca dans ton code :



protected override OnPaint(PaintEventArgs e)

{

Rectangle rect = new Rectangle(30,70,100,60);

SolidBrush sb = new SolidBrush(Color.Red);

Graphics g = e.Graphics



g.FillRectangle(sb,rect);

sb.Dispose();

}


Mais si tu as pu t'en sortir sans, alors y'a pas de souci


Mx
0

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

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 mai 2005 à 18:35
Oui mais maintenant fait passer une fenetre quelconque au dessus de la tienne et tu verras ce que Mx voulait dire :-)

Méthode Form.OnPaint => Control.OnPaint

Pour faire un override :
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);

// ton code de dessin
}

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
8 mai 2005 à 18:43
D'accord, je comprend. Merci les gars, c'est sympa d'avoir des réponses intéressantes si rapidement.
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
10 mai 2005 à 18:23
L'argument e que prend OnPaint en entrée, quel est-il, quand j'appelle
OnPaint, est-ce que je doit envoyé un argument en entrée à la fonction ?

OnPaint(argument); ? Si oui, alors quel est cet argument ? Suis-je clair ? hum



J'ai fait un petit programme qui marche bien sauf que le dessin n'est
pas persistant. La fonction qui fait le dessin s'appellait void
graph(). Je l'ai renomée en

protected override void OnPaint(PaintEventArgs e) {}



et j'ai ajouté


base.OnPaint (e);


avant le code de mon dessin dans OnPaint mais celui-ce ne persiste toujours pas.

Est-ce parceque j'aurait du définir l'argument e ?



Merci
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 18:26
Un dessin n'est jamais persistant.
Et ce n'est aps à toi d'appeler OnPaint, elle l'est auomatiquement à chaque fois que la zone cliente doit etre redessinée.
Si tu veux forcer le rafraichissement tu as la methode Refresh par exemple.

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
10 mai 2005 à 18:49
D'accord, pour l'utilisation de refresh, si je veux raffraichir dès que
l'on a changé la taille de la fenêtre, comment imposer cette condition
au raffraichissement ?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 18:55
Voir l'evenement Resize :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
10 mai 2005 à 18:58
Merci bien



(ils ont vraiment pensé à tout en faisant leur language les mecs !!)
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
10 mai 2005 à 20:52
Et ben encore un petit problème. A chaque fois que je met des fonction qui traitent des évennements comme





private void MainForm_Resize(object sender, System.EventArgs e)


{


if ( this.WindowState == FormWindowState.Minimized)


this.ShowInTaskbar = false;








ou



private void MainForm_Resize(object sender, System.EventArgs e)

{
Control control = (Control)sender;

// Ensure the Form remains square (Height = Width).
if(control.Size.Height != control.Size.Width)
{
control.Size = new Size(control.Size.Width, control.Size.Width);
}
}


la compilation se passe bien mais aucun évènement n'est détecté, ni
quand la fenètre est réduite (exemple 1) ni quand sa taille n'est plus
carrée (exemple 2). Qu'est-je oublié ?



Je n'ai fait qu'un copier/coller de ces bouts de code dans mon
programme d'origine. Je n'ai rien défini de plus dans
InitializeComponent par exemple (ni nul part ailleurs).
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 23:06
As tu quelque part une ligne de ce genre ? :

this.Resize += new EventHandler(this.MainForm_Resize);

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
10 mai 2005 à 23:48
Ah, voilà ! Je pensais bien devoir rajouter quelque chose dans InitializeComponent().



Merci.



Ceci me permet de poser une nouvelle question (j'en ai visiblement beaucoup mais du coup j'apprend vite) :



Quelle commande permet de ne pas afficher les lignes et les rectangles
etc. au fur et à mesure qu'ils sont dessinés mais seulement une fois
qu'ils le sont tous ? J'ai lu son existence y'a quelques jours mais je
ne pensais pas en avoir besoin et je n'arrive pas à remettre la main
dessus.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 mai 2005 à 00:01
Euh là en dehors de passer par un "buffer" (dessiner sur une image puis dessiner l'image sur le form) je ne vois pas

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
11 mai 2005 à 00:21
D'accord, je sais pas si ça vaut le coup mais je vais regarder un peu ce que c'est.

Au fait merci pour toutes tes explications. Grace à toi, mon programme prend de la forme.

J'en suis à plus d'une centaine de lignes et ça marche comme je veux.



Je trouve le c# et probablement la programmation en général très
ennivrant. J'ai arreté y'a quasiment 1 an parceque je n'ai plus eu le
temps mais là, je reprend à la vitesse grand V.



Bonne nuit, probablement à demain.
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 mai 2005 à 09:15
Tiens, voila un exemple pour le buffer:



Bitmap backBuffer


protected override OnPaint(PaintEventArgs e)

{

// Creation du tampon

if(backBuffer null) backBuffer new Bitmap(this.width, this.Height);

// On recupere le Graphics du tampon

Graphics gBuffer = Graphics.FromImage(backBuffer);

gBuffer.Clear(this.BackColor);



Rectangle rect = new Rectangle(30,70,100,60);

SolidBrush sb = new SolidBrush(Color.Red);

// On dessine dans le tampon
gBuffer.FillRectangle(sb,rect);

sb.Dispose();

gBuffer.Dispose();



// Et enfin, on dessine l'image tampon

e.Graphics.DrawImageUnscaled(backBuffer, 0, 0);

}

Mx
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007
11 mai 2005 à 21:07
Merci, je vais essayer celà tout à l'heure.
0
Rejoignez-nous