IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Gestion d'événements et Drawing: apparition de l'ellipse seulement après le départ de la souris


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Gestion d'événements et Drawing: apparition de l'ellipse seulement après le départ de la souris
    Bonsoir,

    Je débute en C# et bloque un peu sur la gestion d'événements. J'essai pour l'instant de faire un programme très simple pour essayer de comprendre le fonctionnement.
    Le but du programme est de faire apparaître une ellipse sur une image contenue dans une pictureBox lorsque je clique sur un bouton. Or, l'ellipse n' apparaît qu'une fois que la souris a quittée le bouton... Pourtant l'événement écouté est bien Click...
    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                pictureBox1.Image = Image.FromFile(@"C:\Users\john\Desktop\image1.jpg");
     
            }
     
            private void button1_Click(object sender, MouseEventArgs e)
            {
               this.Paint += new PaintEventHandler(Form1_Paint);
     
            }
     
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Draw(e);
            }
     
            public void Draw( PaintEventArgs e)
            {
     
     
                Graphics g = pictureBox1.CreateGraphics();
                g.DrawEllipse(new Pen(Color.Red), 10, 10, 50, 50);   
                pictureBox1.Refresh();
     
            }
     
        }
    }

    Je suis bien conscient que pour arriver à mon objectif, il y a beaucoup plus simple ( comme réaliser le dessin dans la méthode attachée au clic sur bouton) mais je me ronge le cerveau depuis beaucoup de temps pour comprendre ce problème qui vient, je pense, de ma mauvaise compréhension de la gestion des événements...
    Merci d'avance à vous, mes lanternes avisées

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 208
    Points : 727
    Points
    727
    Par défaut
    Bonjour,

    Essayes en forçant le rafraichissement de la fenêtre à la fin de ton événement Click.

    Cordialement.

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bonjour

    Quel horreur ton code...

    Déjà, ajouter une callback sur l'event dans le Click de la souris, c'est juste IMPOSSIBLE...

    Le plus propre pour faire ce que tu veux (et la question a déjà été posé plein de fois sur ce forum).. enfin

    Il te faut créer un controle utilisateur qui va hériter de ta pictureBox...

    Par exemple

    public class MyPictureBox : PictureBox

    Ensuite, tu pourrais surcharger (override) l'évènement "OnPaint" de ton controle ainsi crée...

    Et après, tu rajoutes un override sur le MouseDown ou MouseUp de ton controle pour récupérer les coordonnées de la souris pour savoir ou il faudra dessiner ton ellipse...

    Voici un bout de code qui correspond à ce qu'il faut faire... (t'as de la chance que je sois tranquille cet apres midi)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     public partial class MyPictureBox : PictureBox
        {
            Point ellipsePosition = Point.Empty;
     
            public MyPictureBox()
            {
                InitializeComponent();
                SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            }
     
            protected override void OnPaint(PaintEventArgs pe)
            {
                base.OnPaint(pe);
                if (ellipsePosition != Point.Empty)
                {
                    Graphics g = pe.Graphics;
                    Pen p = new Pen(Color.Red);
                    Rectangle rec = new Rectangle(ellipsePosition.X - 10,ellipsePosition.Y-10,20,20);
                    g.DrawEllipse(p, rec);
                    p.Dispose();                
                }
            }
     
            protected override void OnMouseDown(MouseEventArgs e)
            {
                base.OnMouseDown(e);
                ellipsePosition = new Point(e.X, e.Y);
                Invalidate();
            }
        }
    et basta

    et J'ajouterais juste que ton incompréhension ne vient certainement pas d'une lacune sur la gestion des évènements mais surtout sur un ENORME besoin de lire un cours sur C# et .Net

    3 mn
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il y a aussi un manque de connaissance sur le mécanisme de dessin en windows forms

    en cas de modification d'une propriété d'un controle (ou de demande forcée via .refresh ou .invalidate) l'event paint du controle va être appelé
    dans cet event paint un graphics est fournit, c'est sur lui qu'il faut dessiner, tous les controles se dessinnent entièrement comme ca (drawrectangle, drawstring, drawimage ...)
    l'event paint peut etre appelé très souvent, jusqu'à plusieurs centaines de fois par seconde sur des vieux os comme windows xp en cas de déplacement (à partir de vista les forms sont en cache donc ca va beaucoup mieux)
    tout ce qui est dessiné via creategraphics et donc pas dans l'event paint d'un control est alors effacé car pas redessiné
    de plus form hérite de control
    et parfois l'event se "propage" sur les controles enfants (cas de la transparence par exemple, c'est pourquoi la transparence ralentie une appli windows forms)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Gestion des évènements Netscape 7.0
    Par RATHQUEBER dans le forum Autres langages pour le Web
    Réponses: 6
    Dernier message: 19/12/2005, 16h26
  2. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07
  3. [JTable] gestion des événements
    Par soulhouf dans le forum Composants
    Réponses: 4
    Dernier message: 19/08/2005, 13h21
  4. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04
  5. Gestion d'événements hors tables
    Par Quentin dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 11/02/2005, 00h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo