Problème de dessin en utilisant un bitmap [Résolu]

Signaler
Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006
-
Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006
-
Bonjour,

Je suis en train de faire une application qui génére un graphe de boutons. Au début, il y a un seul bouton et quand on clique dessus si ce bouton a des fils ils s'affichent avec des connections entre le bouton père et les boutons fils et ainsi de suite. Je déploie ainsi autant de boutons qu'il y a de données dans une liste spécifique qui sert de données d'entrée de mon programme. Je peux aussi faire le contraire: si j'appuie sur le bouton père les fils disparaissent etc...
 Comme mes boutons sont liés à des données qui peuvent évoluer selon la taille de ma liste le graphe peut être différent et les connections également.

J'affiche mes boutons via des méthodes show() et je les masque via hide() selon le status du bouton que je clique (j'utilise un délégué pour ça), concernant les connections j'utilise le gdi pour dessiner mes lignes. J'ai eu de très bon résultats avec tout ça par contre je me suis ensuite aperçu que si je bouge ma fenêtre ou que si je la redimensionne les graphiques du gdi disparaissent. En fait après info les boutons sont persistants de par leur nature et les dessins en gdi non. Il faut mettre les graphisme que l'on veut afficher dans une méthode paint si on veut des dessins persistants.
Comme j'utilise un délégué et que mon graphe évolue perpétuellement selon que je clique sur  les boutons ou  non j'ai pas vraiment réussi à faire une méthode paint qui me donnait le même résultat.

Du coup j'essaie maintenant d'avoir des dessins persistants via du double buffering en utilisant un bitmap. J'arrive maintenant à avoir des dessins persistant quand je redimensionne ma fenêtre  par contre  quand j'utilise mon application  depuis le début j'ai des problèmes d'affichage avec mes connections. On dirait que le bitmap ne s'adapte pas correctement à ma fenêtre cliente où s'affiche mon graphe. Les dimensions de dessins sont différentes pourtant je rentre bien les mêmes tailles de surface pour les deux buffers.
Du coup, je sèche un peu.

Cette méhode marche bien.
protected override void OnPaint( PaintEventArgs e )
{
   // base.OnPaint( e );
  
   Graphics g = e.Graphics;
   g.DrawImage( bmp, this.ClientRectangle );
}
...
...
Par contre, là ça à l'air de pas fonctionner comme il faut:
Font f = new Font("Arial", 12F);
gBmp.DrawLine(pen,new Point (Xp,Yp),new Point(lx2+32,ly2+100));
Rectangle r = new Rectangle(lx2+28, ly2+95, 30, f.Height);
gBmp.DrawEllipse(Pens.Black, r);
gBmp.DrawString(s, f, Brushes.Black, r);
 f.Dispose();
                                
// draw the bitmap on our window
gForm.DrawImage(bmp,this.ClientRectangle);
....
...
J'ai déclaré avant tout ça mon buffer ...:
Xlength=Screen.PrimaryScreen.Bounds.Width; //je fixe des dimensions ici et elles sont les mêmes pour le form
Ylength=Screen.PrimaryScreen.Bounds.Height; //
Graphics gForm = CreateGraphics();
bmp =new Bitmap(Xlength, Ylength, PixelFormat.Format32bppArgb);
Graphics gBmp = Graphics.FromImage(bmp);
gBmp.CompositingMode = CompositingMode.SourceCopy;

Voilà, j'ai fait très long, mais c'est pas très facile non plus à expliquer.
Si vous avez une petite idée de ce qui cloche je vous remercie d'avance.

Ro

2 réponses

Messages postés
17
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
6 décembre 2006

J'ai dégoté une site qui m'explique pas mal de chose. Le bitmap que j'utilisais, quand je le projetais à l'écran ça donnait des dessins avec des dimensions un peu bizarre que je n'arrivais pas à rectifier. Du coup mes dessins contenus dans mon bitmap partaient un peu en vrille.
J'ai résolu le problème, j'utilise maintenant une picturebox qui est le container dans mon form de ce que contient mon bitmap. Du coup, je peux manipuler la taille de ma picturebox et le bitmap associé sans problème de dimensions hasardeuses.

Ro

PS:au passage voici l'adresse du site avec des exemples pas mal du tout qui m'a dépanné: http://code.professor-mustard.org/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Salut,

"Comme j'utilise un délégué et que mon graphe évolue perpétuellement selon que je clique sur  les boutons ou  non j'ai pas vraiment réussi à faire une méthode paint qui me donnait le même résultat."

et avec la méthode Invalidate qui est chargée d'appeler la méthode OnPaint ?

"Graphics gForm = CreateGraphics( );"

Si c'est dans le OnPaint ça sert à rien, si c'est un champ de la classe ça pose problème aussi.