GDI +

Résolu
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010 - 15 déc. 2005 à 10:00
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010 - 15 déc. 2005 à 14:50
Bonjour !



Est ce qu'il est possible de remplir un objet Graphics dans un objet externe de sa fenetre ?



ex :



public class maClass

{

private UserControl maFenetre;



private Graphics fenetreDessin;



public maClass

{

maFenetre = new UserControl();

fenetreDessin = maFenetre.CreateGraphics();

}



public void Afficher(objet obj)

{

obj.Afficher(fenetreDessin);

}

}



Et dans mon objet :



public class Ligne

{

Afficher(Graphics g)

{

g.DrawLine( ... );

}

}



Pour l'instant c'est ce que je fais et ca ne marche pas.

16 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
15 déc. 2005 à 14:28
Euh là je n'ai rien de rpécis sous la main désolé.

/*
coq
MVP Visual C#
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 déc. 2005 à 10:05
Salut,

Quand tu dis "ça ne marche pas" : ça ne dessine rien sans lever d'exception ou tu as une erreur à l'execution ?

/*
coq
MVP Visual C#
*/
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 10:09
Pardon, j'ai mal expliqué mon erreur.

En fait ca ne dessine rien du tout, ca ne lève aucune exception

Je ne sais pas utilisé mon graphics a l'exterieur de la méthode OnPaint
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 déc. 2005 à 11:17
Ce n'est pas normal.
Tu peux détailler le code de dessin et les valeurs si possible ?
Regarde aussi si directement derrière tu n'invalide pas la zone de dessin du contrôle.

/*
coq
MVP Visual C#
*/
0

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

Posez votre question
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 11:38
Voila ma classe qui est cencé gérer l'affichage :

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

using ASF.Trafic.Synoptic.AW.Properties;

namespace ASF.Trafic.Synoptic.AW
{
/// <summary>
/// Description résumée de Synoptique.
/// </summary>
public class SynoptiqueViewer
{
#region Propriétés GRAPHIQUES Windows

private UserControl _fenetreSynoptique;

public UserControl FenetreSynoptique
{
get{return this._fenetreSynoptique;}
set{this._fenetreSynoptique = value;}
}

private Graphics _dessin;

public Graphics Dessin
{
get{return this._dessin;}
set{this._dessin = value;}
}

#endregion

#region Propriétés

/// <summary>
/// Thread pour gérer le focus de la souris sur les objets animés
/// </summary>
private Thread _tFocusSouris;

public Thread TFocusSouris
{
get{return this._tFocusSouris;}
set{this._tFocusSouris = value;}
}

/// <summary>
/// Objet ayant le focus souris
/// </summary>
private IReactifMouseEvent ObjetPointe;

private int _nbObjetsAffiches;

public int NbObjetsAffiches
{
get{return this._nbObjetsAffiches;}
set{this._nbObjetsAffiches = value;}
}

#endregion

#region Constructeur

public SynoptiqueViewer(SynoptiqueWindowProperties synopPropertiesViewer)
{
#region Initialisation graphique

this.FenetreSynoptique = new UserControl();
this.FenetreSynoptique.Size = synopPropertiesViewer.Taille;
this.FenetreSynoptique.Location = synopPropertiesViewer.Position;

this.Dessin = FenetreSynoptique.CreateGraphics();
this.FenetreSynoptique.Paint+=new PaintEventHandler(this.OnPaint);

#endregion

this.TFocusSouris = new Thread(new ThreadStart(this.DeterminerFocusObjet));

}

#endregion

#region Méthodes

public void AfficherFondDePlan(FondDePlan fdp)
{
this.FenetreSynoptique.BackgroundImage = fdp.GetFDPEnImage();
}

/// <summary>
/// Abonnement du synoptiqueViewer s'il y a au moins un objet
/// </summary>
///


private void DeleguerEvenementsSouris(bool value)
{
if(value)
{
this.FenetreSynoptique.MouseDown+=new MouseEventHandler(this.MouseEvt);
this.FenetreSynoptique.MouseUp+=new MouseEventHandler(this.MouseEvt);
this.FenetreSynoptique.MouseMove+=new MouseEventHandler(this.MouseEvt);
this.FenetreSynoptique.MouseLeave+=new EventHandler(this.MouseLeave);
}
else
{
this.FenetreSynoptique.MouseDown-=new MouseEventHandler(this.MouseEvt);
this.FenetreSynoptique.MouseUp-=new MouseEventHandler(this.MouseEvt);
this.FenetreSynoptique.MouseMove-=new MouseEventHandler(this.MouseEvt);
this.FenetreSynoptique.MouseLeave-=new EventHandler(this.MouseLeave);
}
}

public void Afficher(IAffichable objet)
{
PaintEventArgs pea = new PaintEventArgs(this.Dessin,new Rectangle(new Point(0,0),new Size(1280,1024)));

objet.Afficher(this.Dessin);

this.Dessin.DrawLine(new Pen(Color.Black,5),new Point(0,0),new Point(1280,1024));

this.OnPaint(this,pea);

this.NbObjetsAffiches++;

if(this.NbObjetsAffiches == 1)
{
this.TFocusSouris.Start();
this.DeleguerEvenementsSouris(true);
}
}

public void Effacer(IAffichable objet)
{
if(this.NbObjetsAffiches == 1)
{
this.DeleguerEvenementsSouris(false);
this.TFocusSouris.Abort();
}

objet.Effacer();

this.NbObjetsAffiches--;
}

#endregion

#region Thread

/// <summary>
/// Lancé en tant que thread cette méthode permet de rafraichir constamment quel objet a le focus de la souris
/// Le but est de savoir à quel objet la fenêtre doit rediriger les évènements souris
/// </summary>
private void DeterminerFocusObjet()
{
while(true)
{

}
}

#endregion

#region Evènements Souris

private void MouseEvt(object sender, MouseEventArgs mea)
{
if(this.ObjetPointe != null)
this.ObjetPointe.Interpreter(mea);
}

private void MouseLeave(object sender, EventArgs e)
{
// Quand la souris quitte le control elle envoie un evt incompatible avec MouseEventArgs
// J'envoie les coordonnées -1,-1 pour dire que le pointeur sors du contol ( a prendre en compte
// du coté des objets réactifs aux évenements souris.

MouseEventArgs mea = new MouseEventArgs(MouseButtons.None ,0,-1,-1,0);

if(this.ObjetPointe != null)
this.ObjetPointe.Interpreter(mea);
}

#endregion

#region Evènement Rafraichissement écran

private void OnPaint(object sender,PaintEventArgs pea)
{

}

#endregion
}
}

Et ca , c'est un objet que je voudrais affiché :

using System;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace ASF.Trafic.Synoptic
{
/// <summary>
/// Description résumée de TraceASF.
/// </summary>
///
[Serializable]
public class TraceASF : Figure, IAffichable
{
private PointF[] _pathASF;

public PointF[] PathASF
{
get{return this._pathASF;}
set{this._pathASF = value;}
}

public TraceASF() : base("1","1","1","1")
{

}
#region Membres de IAffichable

public void Effacer()
{

}

public void Afficher(object fenetre)
{
((Graphics)fenetre).DrawLine(new Pen(Color.Black,5),new Point(0,0),new Point(1280,1024));
}

#endregion
}
}


Et c'est juste pour faire un test
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 11:40
En gros a chaque fois que je voudrais afficher un objet je ferais appel a la fonction Afficher du SynoptiqueViewer
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 déc. 2005 à 12:03
Je ne peux pas tester ton code comme ça, mais à première vue rien ne cloche.
Tu redessines tes éléments à chaque fois que la fenêtre est invalidée ? (il ne faut pas perdre de vue le fait que les "dessins" GDI ne sont pas auto-persistants)

/*
coq
MVP Visual C#
*/
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 12:10
Non je ne le fais pas,
Est ce que ca veut dire que je dois les redessiner a chaque fois que je fais appel a ma méthode OnPaint ?

Merci de ton aide, c'est vraiment important et faire du graphisme ca change complétement d'une logique de formulaire
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 12:13
Et en fait, est ce que tu pourrais pourrais me developper le fait qu'il ne soit pas auto-persistant ?
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 12:14
Et bon appétit entre temps ! lol
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 déc. 2005 à 12:16
Si jamais la zone de dessin est invalidée (passage d'une autre fenêtre au dessus, appel de Refresh, appel de Invalidate, ...) ton UserControl réapparait vide.
Donc il faut voir suivant ce que réclame ton projet.
Si tu as un grand nombre d'éléments, les redessiner à chaque fois va être une perte de temps et de ressources.
La solution serait pour toi de faire une sorte de buffer : au lieu de dessiner directement sur la surface du UC, tu dessines sur un Bitmap aux dimensions de ta zone de dessin, et tu dessines ce Bitmap sur le UC, (en le refaisant à chaque fois que la zone est rafraichie)
Quand à ton image "buffer", tu ne la redessines que à l'ajout de nouveaux éléments, redimensionnement du UC, etc...

Mais en écrivant j'ai un gros doute qui arrive : ton UC, tu l'ajoutes bien à ton formulaire ?

/*
coq
MVP Visual C#
*/
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 déc. 2005 à 12:18
Merci toi aussi ^^

Quand je dit que ce n'est pas auto-persistant, je parle en gros du fait qu'après que tu lui aie donner l'ordre de dessiner une ligne, GDI ne sait plus qu'elle existe, à toi de faire en sorte de le lui rappeler à chaque fois. ;-)

/*
coq
MVP Visual C#
*/
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 14:20
Oui j'ajoute bien mon UC a ma Form.
En fait dans un premier temps j'ai fait une gestion des calques et a chaque rafraichissement j'affiche tous mes objets les uns apres les autres.

J'ai entendu parlé du double buffer, mais j'ai un peu évité la chose, est ce que tu sais ou je pourrais trouvé un exemple d'utilisation ?
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 14:35
Je viens de trouver une sorte de tutorial la dessus, En tout cas merci de tes réponses
0
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
15 déc. 2005 à 14:40
Hello,
Tu pourrais mettre ton lien vers ce tutorial svp ca peut m'interresser

Merci

<hr>ZeBobo5
N'oubliez pas de cloturer votre post.
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 14:50
Le voila : www.dotnet-tech.com/tutoriels/double_buffering/doubleBuffer.pdf
0
Rejoignez-nous