Graphics + ca deconne + Help

Signaler
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour,

Un truc que j'ai pas pigé c'est que je dessine un objet graphics, il se dessine seulement si je le met dans l'evenement click d'un bouton ou autre. Si je le met dans Form1_Load il se dessine point.

Et en plus quand je deplace mon objet Graphics et que je le fais glisser en dehors de la zone d ecran, quand je le fais revenir il a tendance à s'effacer.

Quelqun aurait t'il une solution pour ces problèmes ?

Par avance, merci.

25 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Au moment où l'event Load est déclenché, le Form n'est pas encore affiché, donc tu dessines "dans le vide".
Et quand tu fait passer une autre fenetre au dessus de la tienne (ou que tu fait sortir la tienne de l'ecran), tu dois redessiner.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
merci coq, je dois dire que j'ai regler pas mal de problème grâce à toi, 1906 messages c'est sport quand même.

Si je dessine un cercle dans un panel il ne s'affichera par sur l'evenement form_load. Mais comment en faite forcer mon dessin à se redessiner ? en appellant la fonction dessine_dessin() à chaque fois que ma form bouge ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Sert toi plutôt de l'event Paint.
Et je te conseille de mettre en place un système de buffer : tu dessines tout tes cercles etc sur un Bitmap de la taille de ton Panel et ensuite tu dessines le Bitmap sur le Panel (Graphics.DrawImageUnscaled), ça évitera notamment l'effet de scintillement si tu as beaucoup d'éléments à dessiner.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
ok merci je vais essayer ça et une dernière petite question. Si je peux pas afficher mon dessin sur form1_load à quel moment je l'affiche si je veux qu'il s'affiche au demarrage de la form etant donné qu'il se passe rien après form_load comme evenement ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Maintenant tu vas te servir de l'event Paint du Panel, donc la première fois que celui ci est affiché l'event est déclenché, et donc ton code d'affichage sera appelé :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
ah ok, merci beaucoup, je vais faire ça alors.
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
j'ai essayé ta méthode et j'ai fais :



private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e)


{


Graphics * pg = panel->CreateGraphics() ;


SolidBrush * br1 =
new SolidBrush(Color::Black) ;


Pen * p =
new Pen(br1,1) ;



// dessin du cadre


pg->DrawLine(p,2,2,630,2) ;
// horizontal haut


pg->DrawLine(p,2,500,630,500) ;
// horizontal basse


pg->DrawLine(p,2,2,2,500) ;
// vertical gauche


pg->DrawLine(p,630,2,630,500) ;
// vertical droite



// ligne horizontale du haut vers le bas


pg->DrawLine(p,2,60,630,60) ;


pg->DrawLine(p,2,100,630,100) ;


pg->DrawLine(p,2,140,630,140) ;


pg->DrawLine(p,2,180,630,180) ;


pg->DrawLine(p,2,220,630,220) ;


pg->DrawLine(p,2,260,630,260) ;


pg->DrawLine(p,2,300,630,300) ;


pg->DrawLine(p,2,340,630,340) ;


pg->DrawLine(p,2,380,630,380) ;


pg->DrawLine(p,2,420,630,420) ;


pg->DrawLine(p,2,460,630,460) ;



// ligne verticale de gauche à droite


pg->DrawLine(p,150,2,150,500) ;


pg->DrawLine(p,280,2,280,500) ;


pg->DrawLine(p,490,2,490,500) ;


b =
new Bitmap(623,502,pg) ;


}


private: System::Void panel_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e)


{


e->Graphics->DrawImageUnscaled(b,623,502) ;


}

malheureusement les lignes que j'ai dessiné ne s'affiche pas, pourtant l'evenement panel_pain se declenche bien j'ai testé, je dois avoir une erreur qq part mais je vois où...
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
je vois pas où plutot
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Constructeur Bitmap (Int32, Int32, Graphics)

Il faut créer le Graphics sur le Bitmap plutot :
b = new Bitmap(623, 502);
Graphics pg = Graphics.FromImage(b);
pb.DrawLine(...)
...

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

Bonjour,

Pour info tu veux dessiner des graphique ?

hum.......
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
ca fait ca :



private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e)


{




Graphics * pg = panel->CreateGraphics() ;


SolidBrush * br1 =
new SolidBrush(Color::Black) ;


Pen * p =
new Pen(br1,1) ;



// dessin du cadre


pg->DrawLine(p,2,2,630,2) ;
// horizontal haut


pg->DrawLine(p,2,500,630,500) ;
// horizontal basse


pg->DrawLine(p,2,2,2,500) ;
// vertical gauche


pg->DrawLine(p,630,2,630,500) ;
// vertical droite



// ligne horizontale du haut vers le bas


pg->DrawLine(p,2,60,630,60) ;


pg->DrawLine(p,2,100,630,100) ;


pg->DrawLine(p,2,140,630,140) ;


pg->DrawLine(p,2,180,630,180) ;


pg->DrawLine(p,2,220,630,220) ;


pg->DrawLine(p,2,260,630,260) ;


pg->DrawLine(p,2,300,630,300) ;


pg->DrawLine(p,2,340,630,340) ;


pg->DrawLine(p,2,380,630,380) ;


pg->DrawLine(p,2,420,630,420) ;


pg->DrawLine(p,2,460,630,460) ;



// ligne verticale de gauche à droite


pg->DrawLine(p,150,2,150,500) ;


pg->DrawLine(p,280,2,280,500) ;


pg->DrawLine(p,490,2,490,500) ;




b =
new Bitmap(623, 502);


Graphics * pg = Graphics::FromImage(b) ;


}

Il faudrait que je remplace


Graphics * pg = panel->CreateGraphics() ;



par


Graphics * pg b->CreateGraphics() ; // b le bitmap

je pense

mais y' a pas de creategraphics sur la classe bitmap

oui athlus, là je veux dessine un tableau mais sinon je vais dessiner des camenbert avec des barres par la suite
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Oui je sais qu'il n'y a pas de méthode CreateGraphics sur la classe Bitmap (celle des contrôles est héritée de la classe Control, dont n'hérite évidemment pas Graphics)

Par contre dans l'exemple plus haut j'ai parler de la méthode Graphics.FromImage.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

J'ai réalisé une dll qui permet de tracer des tableaux de points dans un graphique avec calcul des échelles et tracage du graphique + titre graphique et echelles mais elle est pas tout à fait au point je la metterais sur le site surement dans la journée si ca peut t'intéresser...

hum.......
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
merci athalus,

en faite le truc que je comprends point, c'est que je fais dans form_load

b =
new Bitmap(623, 502);


Graphics * pg = Graphics::FromImage(b) ;

donc mon graphics qui s'appelle pg est égal au bitmap. mais quand je dessine je fais pg->drawline() et pas b->drawline() . donc mon graphics pg est vide. Je dessine sur le graphics est pas sur le bitmap.

ca fait :


b =
new Bitmap(623, 502);


Graphics * pg = Graphics::FromImage(b) ;


pg = panel->CreateGraphics() ;


SolidBrush * br1 =
new SolidBrush(Color::Black) ;


Pen * p =
new Pen(br1,1) ;



// dessin du cadre


pg->DrawLine(p,2,2,630,2) ;
// horizontal haut

etc...
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

Moi je fais comme ca


private System.Windows.Forms.Panel panelGraphique;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


private Graphics fond;


private Bitmap Bmp;



// le panel est initialisé ( taille emplacement ... )





Bmp= new Bitmap(panelGraphique.Width,panelGraphique.Height);


fond = Graphics.FromImage(Bmp);




// ici tu traces tes lignes ou autre sur le graphics (ici fond)

panelGraphique.BackgroundImage = Bmp; //affiche ton bmp dans ton panel

hum.......
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
je suis en train de faire comme lui y fait : http://forums.labo-dotnet.com/ShowPost.aspx?PageIndex=1&PostID=152 mais ca couille

e.Graphics.DrawImageUnscaled(back,ClientRectangle);

je pige pas comment y peut metre clientrectangle puisque c un panel et que le constructeur ne les acceptes pas enfin.. mystère

En faite c pas une image bmp que je veux dessiner mais un objet Graphics que je veux dessiner dans le panel
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
c'est ce que coq à dit en faite mais je dois avoir une propriété qui est à false qq part, ca devrais marcher
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

En fait moi je dessine sur un bmp car je trace des tableaux ayant desfois plus de 300 000 points du coup si je redessine à chaque evenement Paint ca prend 3 plomb ... utiliser le bmp te permet de ne pas avoir à redessiner tout le temps...

hum.......
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
oui, mais par la suite je voudrais dessiner des camberts avec les parts qui se detache etc... alors je sais pas trop si les bmp conviendrais pour faire ca
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Ba si tu dessines sur le Bitmap, puisque le Graphics est crée dessus.

Bon aller petit exemple vite fait (avec ton code) :


private Bitmap b;

private void Form1_Load(object sender, System.EventArgs e)
{
b = new Bitmap(panel.Width, panel.Height);
Graphics pg = Graphics.FromImage(b);

SolidBrush br1 = new SolidBrush(Color.Black) ;
Pen p = new Pen(br1,1) ;
// dessin du cadre
pg.DrawLine(p,2,2,630,2) ; // horizontal haut
pg.DrawLine(p,2,500,630,500) ; // horizontal basse
pg.DrawLine(p,2,2,2,500) ; // vertical gauche
pg.DrawLine(p,630,2,630,500) ; // vertical droite
// ligne horizontale du haut vers le bas
pg.DrawLine(p,2,60,630,60) ;
pg.DrawLine(p,2,100,630,100) ;
pg.DrawLine(p,2,140,630,140) ;
pg.DrawLine(p,2,180,630,180) ;
pg.DrawLine(p,2,220,630,220) ;
pg.DrawLine(p,2,260,630,260) ;
pg.DrawLine(p,2,300,630,300) ;
pg.DrawLine(p,2,340,630,340) ;
pg.DrawLine(p,2,380,630,380) ;
pg.DrawLine(p,2,420,630,420) ;
pg.DrawLine(p,2,460,630,460) ;
// ligne verticale de gauche à droite
pg.DrawLine(p,150,2,150,500) ;
pg.DrawLine(p,280,2,280,500) ;
pg.DrawLine(p,490,2,490,500) ;
}

private void panel_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
panel.CreateGraphics().DrawImageUnscaled(b, 0, 0);
}

Cocoricoooooooo !!!!
coq
MVP Visual C#