Appel de fonction Paint

Résolu
dod0 Messages postés 13 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 2 juin 2008 - 19 mai 2008 à 12:02
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 - 20 mai 2008 à 17:04
bonjour, je suis débutant en C# et j'essai de créé une cible qui suit mon curseur j'y arrive très bien le probléme est que ma méthode demande trop au processeur donc j'aimerais savoir comment faire pour résoudre sa et est-ce que c'est mon programme qui est pas bon? car j'ai pensé appeler ma fonction panel3_Paint dans ma fonction panel1_MouseMouve ?

voilà mon code ...


Point Depart =
new
Point();

Pen pen =
new
Pen(
Color.Black);



private



void
panel1_MouseMove(

object
sender,

MouseEventArgs
e)
{


      Panel
p = sender

as



Panel
;




      if
(e.Button ==

MouseButtons
.Left)
      {


            Point
mousePos =

this
.PointToClient(

Control
.MousePosition);




                  if
(Depart.IsEmpty)
                  {
                        Depart =

new



Point
(mousePos.X - p.Left, mousePos.Y - p.Top);
                  }
            p.Location =

new



Point
(mousePos.X - Depart.X, mousePos.Y - Depart.Y);
      }
      

else



if
(!Depart.IsEmpty)
            Depart =

new



Point
();
      }




//********************** création de la cible pour le curseur *************************//








public



void
panel3_Paint(

object
sender,

PaintEventArgs
e)
{
      

Panel
p = sender

as



Panel
;
      

Point
mousePos =

this
.PointToClient(

Control
.MousePosition);
      e.Graphics.DrawLine(pen, 0, mousePos.Y - p.Top, 1000, mousePos.Y - p.Top);      
      e.Graphics.DrawLine(pen, (mousePos.X - p.Left), 0, mousePos.X - p.Left, 1000);
      

//this.Refresh(); utilise trop de m‚moire

}
}

12 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
20 mai 2008 à 11:53
non, en fait il te suffit de créer ta cible dans ton constructeur, puis lorsque tu affecte la cible au curseur du controle concerné (toujours dans le contructeur). si cest pour lensemble de ton formulaire que tu veux ce changer, tu as juste faire this.Cursor = TonCurseur;
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
19 mai 2008 à 14:16
déjà tu redessine a chaque fois tes lignes. pourquoi ne pas prédessiner ta "cible" dans le constructeur, et simplement la flusher dans le mousemove. tu devrais déjà gagner un peu. ensuite, au lieu de refresh this, tu peux refresh uniquement la partie qui a besoin d'être refresh (ca doit etre possible avec un appel a invalidate je pense, il me semble qu'on peut choisir un rectangle cible). ainsi tu as juste a invalider la position de lancienne cible, puis a faire ton dessin. Et au lieu d'appeler la méthode paint dans le mousemove, tu dois faire le invalidate la bas.

ainsi, tu override la méthode onpaint ou tu place ton code, puis tu invalide la zone qui a besoin detre repainte dans le mousemove. Au final tu ne dessine pas  a chaque fois mais tu "flush" une image déjà initialisée.
0
dod0 Messages postés 13 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 2 juin 2008
19 mai 2008 à 14:25
Merci de ton aide  sa m'éclaire un peu, je vais essayer d'appliquer sa malgrès que pour moi certaine chose que tu m'explique me sont inconnu comme le invalidate que je ne comprends pas tout à fait :s
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
20 mai 2008 à 09:22
Invalidate te permet de dire à l'application "telle partie de ma fenetre n'est plus valide et doit etre redessinée". cest assez proche de  ton refresh, sauf que ca va te permettre de travailler uniquement sur les portion nécessaires de ton formulaire. autrement dis, au lieu de redessiner toute la fenetre, tu redessine uniquement la portion qui n'est plus valide (celle ou il y avait ta cible et ou il ne doit plus rien y avoir)
0

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

Posez votre question
dod0 Messages postés 13 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 2 juin 2008
20 mai 2008 à 10:02
d'accord je vois mieux comment l'utiliser maintenant merci beaucoup de ton aide car je galère un peu en C# vu que mon language de départ est le PASCAL. Et la j'ai quelques problémes pour le constructeur pour la création de ma cible car je vois exactement comment créer tous cela mais pas comment faire le "flush" comme tu me l'a indiqué?
 désolé je débute réellement donc je préfére passer pour un vrai novice que rester bloqué
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
20 mai 2008 à 10:59
tu dois créer une image en temps que données membre de ta classe. dans ton constructeur tu dessine la cible dans ton image avec un fond transparent.

Par contre je suis en train de réaliser : pourquoi ne pas simplement changer le curseur lorsque tu es sur ce formulaire (tout simplement?)
0
dod0 Messages postés 13 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 2 juin 2008
20 mai 2008 à 11:22
ok merci pour l'explication et pour ce que tu pensais quand tu dis "changer le curseur lorsque tu es sur ce formulaire" tu parle de faire par exemple :

Cursor.Current =
Cursors.Cross;     ou autre ???
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
20 mai 2008 à 11:35
oui, mais plutot (vu que tu veux un truc perso) utiliser une image a toi
0
dod0 Messages postés 13 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 2 juin 2008
20 mai 2008 à 11:48
ouais j'y avais pensé mais tu vois mon probleme c'est comment faire pour l'appeler avec cette méthode car l'objet cible par exemple, je n'arrive pas à le créé et l'appeler, je suis pomé car je pense que je me base trop sur ce que j'ai vu avec Delphi, car en delphi j'aurai créé un nouveau composant que j'aurai appelé dans ma fonction principal dois-je faire pareil ici? et si je suis ton résonnement je dois créé ma cible dans le constructeur et après appeler le changement de curseur dans mon Mouse Mouve de mon Panel?
Merci de ta patiente en tout cas car c'est plutot rare sur certains forum  
0
dod0 Messages postés 13 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 2 juin 2008
20 mai 2008 à 12:01
d'accord sa à l'aire mon sorcier que la premiére solution  donc je vais essayer de faire sa en construisant correctement ma cible dans mon constructeur, MERCI de ton aide précieuse
0
dod0 Messages postés 13 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 2 juin 2008
20 mai 2008 à 16:28
finalement j'ai beau essayer de créer ma cible dans le constructeur je n'y arrive pas du tout  je dois bien faire sa ?

public Cursor (Type type,Ressource resource)

et après définir les différents paramètres de ma cible mais je ne vois pas comment utiliser le e.Graphics.Drawline(pen, x,y,z,h), il y a certainement un autre moyen mais la je suis pomé et je crois surtout que je commence à tout mélanger?
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
20 mai 2008 à 17:04
oui tu mélanges. tu vas devoir soit créer un curseur dans un fichier, pas par le code mais de manière statique et dans ce cas instancier l'image utilsiée par le curseur en utilisant le fichier, soit créer l'image du curseur dans le code (dans ce cas créer uen image dans le constructeur, récupérer le graphics de cette image et dessiner dans ce graphics de l'image). Essaie de prendre le fonctionnel avant de partir dans du code et vouloir utiliser des lignes.
que veux tu faire? changer le curseur. ca veut dire quoi? avoir une image qu'on va utiliser en tant que curseur. comment avoir cette image? a toi de répondre. poses toi les bonnes questions avant de te jeter a corps perdu dans le code
0
Rejoignez-nous