cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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#
*/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Equinox84
Messages postés63Date d'inscriptionlundi 2 février 2004StatutMembreDernière intervention19 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;
/// <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)
{
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);
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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)
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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 ?
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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. ;-)
Equinox84
Messages postés63Date d'inscriptionlundi 2 février 2004StatutMembreDernière intervention19 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 ?