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

Signaler
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007
-
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007
-
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

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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#
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Tu peux overrider la méthode OnPaint et y placer ce bout de code


Mx
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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 ?
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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#
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

D'accord, je comprend. Merci les gars, c'est sympa d'avoir des réponses intéressantes si rapidement.
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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#
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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 ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Voir l'evenement Resize :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

Merci bien



(ils ont vraiment pensé à tout en faisant leur language les mecs !!)
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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).
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
As tu quelque part une ligne de ce genre ? :

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

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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#
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
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
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

Merci, je vais essayer celà tout à l'heure.