none
Création d'objet graphique RRS feed

  • Question

  • <p class="MsoNormal">Bonjour,<br><br> Je souhaite dessiner dans une frame un objet sous forme d'un disque "primaire" dont le rayon est dynamique, puis à l'intérieur de ce disque je voudrais créer des objets sous forme de points "petits disques" avec la possibilité de les déplacer et cliquer dessus pour afficher un menu<br> Je cherche à réaliser quelque chose qui ressemble à la fonction dessiner un cercle dans Word<br> comme la photo insérée<br> je cherche des lignes directives ou des mots clés en C# pour pouvoir réaliser ceci<br> Merci</p> http://img408.imageshack.us/my.php?image=platformejr3.jpg<br><br>RED1<img src="http://www.csharpfr.com/imgs2/smile_cool.gif">
    vendredi 10 août 2007 16:28

Réponses

  • foreach(Forme f in ...)

    {

        if (f.EstDans(PointClique) == true)

        {

              //Alors l'utilisateur a cliqué sur la forme qui est actuellement "f"

             

              //Pour déplacer cette forme, il suffit de faire (un truc du genre) :

              f.Rectange.OffSet(dx, dy);

              //Où dx et dy, les 2 vecteurs de directions sur l'axe x et y

         }

    }

     

    Cordialement

    mardi 28 août 2007 13:14
    Modérateur

Toutes les réponses

  • Il vous faut créer une structure de données qui contient toutes les informations de vos cercles (Position, Taille, Couleur...etc).

     

    Ensuite vous les dessinez via Graphics.DrawEllipse().

     

    Gérez ensuite un événement qui intercepte le click de la souris, et recherchez dans votre structure de données s'il existe une cercle à la position X,Y du clic de la souris...

     

    Cela devrait déjà être un bon début...

     

    Cordialement

    vendredi 10 août 2007 18:08
    Modérateur
  • Merci pour votre réponse;

     

    Pour l'instant j'arrive à dessiner des disque/cercles seulement ces derniers sont statiques, autrement dis; quand je click sur la frame un disque/cercle se dessine et j'ai l'impression que Windows me renvoie une nouvelle frame avec le disque/cercle dessiné, tandis que je cherche une autre reproduction.  Le disque/cercle "doit" se manifeste comme un objet que je peux le déplacer le modifier. En fin recréer la même fonction de Word pour dessiner des objets.

    Merci.

     

    Cordialement

    mardi 21 août 2007 09:13
  • Pouvez montrer votre code ?

    Qu'appellez vous par "frame" ? par "Windows me renvoie une nouvelle frame..." ?

     

    Normalement lors d'un clic sur un de vos cercles, vous devez parcourir tous les objets que vous avez gardé en mémoire afin de trouver un objet se trouvant au coordonnées cliqué par l'utilisateur... Une fois que vous avez trouvé cette objet, vous changez les propriété de cette objet (la position par exemple) et vous notifiez votre fenêtre pour redessiner la portion de la zone qui doit être redessinée...

     

    Cordialement

    mardi 21 août 2007 15:43
    Modérateur
  • Voici une partie de mon code. Merci.


    Cordialement



      private void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                if (e.Button == System.Windows.Forms.MouseButtons.Left)
                {
                    PointCourant = new Point(e.X, e.Y);
                    switch (TypeForme)
                    {
                        case TypeFormeEnum.rectangle :
                            sapinDoc.Add(new Rectangle(CouleurForme,new System.Drawing.Rectangle(PointCourant, TailleForme)));
                            break;

                        case TypeFormeEnum.ellipse :
                            sapinDoc.Add(new Ellipse(CouleurForme,new System.Drawing.Rectangle(PointCourant, TailleForme)));
                            break;

                        case TypeFormeEnum.triangle :
                            sapinDoc.Add(new Triangle(CouleurForme,new System.Drawing.Rectangle(PointCourant, TailleForme)));
                            break;

                    }
                    Invalidate();
                }
                else if (e.Button == System.Windows.Forms.MouseButtons.Right)
                {
                    //code pour le menu qui apparait suite à un click droit sur l'objet déssiné
                    // déplacer suprimer autre...
                }
            }

            private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                sapinDoc.Draw(e.Graphics);

            }


    Autres classe :

    public class Ellipse : Forme
        {
            private System.Drawing.Rectangle rect;
            public System.Drawing.Rectangle Rect
            {get{return rect;}set{rect =value;}}
       
            public Ellipse(Color co, System.Drawing.Rectangle re)
                :base(co)
            {rect = re;}
       
            public Ellipse(){}

            override public void Draw(System.Drawing.Graphics gr)
            {
            Pen pen = new Pen(Couleur); // Choisir un pinceau
            SolidBrush brush = new SolidBrush(Couleur);
            gr.DrawEllipse(pen,rect);
            gr.FillEllipse(brush,rect);
            }
           
        }



    public class DocumentSapin
        {
            ArrayList listeFormes;
            public DocumentSapin()
            {
                listeFormes = new ArrayList();
            }

            public void Add(Forme forme)
            {
                listeFormes.Add(forme);
            }

            public void Draw(System.Drawing.Graphics gr)
            {
                foreach (Sapin.Forme forme in listeFormes)
                {
                    forme.Draw(gr);
                }
            }
           

        }
    mardi 21 août 2007 17:05
  • Tu vas devoir comme Gilles à dit, de retrouver l'objet qui est sous le curseur par sa position. Un des trucs que tu peux utiliser pour essayer de retrouver l'objet, est de classé les objets dans ta liste selon un ordre particulier ( comme par exemple la position en X ), n'oublie pas que tu vas peut-etre avoir des formes une sur l'autre, ce qui complique un peu les choses.
    mardi 21 août 2007 18:13
    Modérateur
  • Votre code est assez bien organisé...

     

    Je vous conseille de créer une méthode abstraite dans la classe Forme qui s'appelle bool EstDans(Point p);

    Chaque classe dérivant de Forme devra implémenter cette classe et renvoyer true si le point passé en paramètre est dans la forme...

     

    Dans Ellipse par exemple vous pouvez implémenter ceci :

     

    Code Snippet

    public override bool EstDans(Point p)

    {

        return this.rect.Contains(p);

    }

     

     

    Ainsi vous parcourez votre tableau ArrayList et appelez la méthode EstDans() afin de recherche votre forme, vous la déplacez, et redessinez le tout !

     

    Code Snippet

    foreach(Forme f.....)

    {

         if (f.EstDans(PointCliqué) == true)

         {

              //Déplacer la forme

              //Redessiner la forme

              break;

         }

    }

     

    Dommage que Microsoft n'a pas implémenter un bouton "tirer les oreilles" dans les Forums...

    N'utilisez plus ArrayList dans DocumentSapin, mais les listes typés génériques (cela évite les erreurs et les cast !)

     

    Utilisez donc dans votre DocumentSapin :

    Code Snippet

    private List<Forme> listeFormes;

     

    Cordialement
    mercredi 22 août 2007 10:40
    Modérateur
  •  Gilles TOURREAU A écrit:

    Dommage que Microsoft n'a pas implémenter un bouton "tirer les oreilles" dans les Forums...

    N'utilisez plus ArrayList dans DocumentSapin, mais les listes typés génériques (cela évite les erreurs et les cast !)

     

    Utilisez donc dans votre DocumentSapin :

    Code Snippet

    private List<Forme> listeFormes;



    Effectivement, cela aurait dûe faire partie du Framework 1.0, cela empêcherais les mauvaises habitudes. Mais quand on découvre les génériques, alors on ne peut plus s'en passer!
    mercredi 22 août 2007 12:07
    Modérateur
  • Merci pour votre aide,

     

    Maintenant je cherche à créer un tableau ou je stocke les objets dessinés puis d'autres informations à propos de ces objets (Coordonnées, autres, ...).

     

    Voila mon code qui n'est pas opérationnel, toute proposition est la bien venue avec mes remerciement bien sûr

     

    namespace Sapin

    {

          /// <summary>

          /// Description résumée de DocumentSapin.

          /// </summary>

          public class DocumentSapin

          {

                public ArrayList listeFormes;

                public Forme []TableauObjForm;

                int intNextObj = 0;

     

                //affin de remettre en place un objet modifié, j'implémente

                //un indexeur de la propriété Count comme suivant

                public int Count

                {get {return listeFormes.Count;}}

     

                public Forme this [int index]

                {

                      get

                      {

                            if ( index >=0 && index< Count)

                                  return (Forme) listeFormes[index];

                            else

                                 return null;

                      }

                      set

                      {

                            if ( index >=0 && index< Count)

                                 listeFormes[index]=value;

                      }

                }

     

                public DocumentSapin()

                {

                      listeFormes = new ArrayList();

                      TableauObjForm = new Forme[4];                

     

                }

     

     

                public void Add(Forme forme)

                {

                      if (listeFormes.Count<4)

                      {

                            listeFormes.Add(forme);

                            if (intNextObj < TableauObjForm.Length)

                            {TableauObjForm[intNextObj++] = forme;}

                      }

                }

     

                public void Draw(System.Drawing.Graphics gr)

                {

                      foreach (Sapin.Forme forme in listeFormes)

                      {

                            forme.Draw(gr);

                      }

                      for (int i=0; i<intNextObj; i++)

                      {

                            TableauObjFormIdea.Draw(gr);

                      }

                     

                }

               

          }

    }

     

    La fonction dessiner

    private void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

    {

           if (e.Button == System.Windows.Forms.MouseButtons.Left)

           {

                 PointCourant = new Point(e.X, e.Y);

     

                 if((Math.Pow((e.X-255.5),2)+(Math.Pow((e.Y-255.5),2)))<Math.Pow(242.5,2))

                 {

                        switch (TypeForme)

                        {

                               case TypeFormeEnum.rectangle :

                                      sapinDoc.Add(new Rectangle(CouleurForme,new System.Drawing.Rectangle(PointCourant, TailleForme)));

                                      break;

                               case TypeFormeEnum.ellipse :

                                      sapinDoc.Add(new Ellipse(CouleurForme,new System.Drawing.Rectangle(PointCourant, TailleForme)));

                                      //MessageBox.Show(sapinDoc.listeFormes.ToString());

                                      break;

                               case TypeFormeEnum.triangle :

                                      sapinDoc.Add(new Triangle(CouleurForme,new System.Drawing.Rectangle(PointCourant, TailleForme)));

                                      break;

                        }

                        Invalidate();

                 }

           }

           else if (e.Button == System.Windows.Forms.MouseButtons.Right)

           {

                 PointCourant = new Point(e.X, e.Y);

                 Pointfinal = new Point(240,240);

                 foreach(Sapin.Forme forme in sapinDoc.listeFormes )

                 {

                        if (forme.EstDans(PointCourant) == true)

                        {

                               //Déplacer la forme Comment?

                               //Redessiner la forme Comment?

                               //sapinDoc.listeFormes.Remove(1);

                               //contextMenu1.Popup += new EventHandler(menuItem1.DrawItem);

                               //contextMenu1.Show(Sapin.MainFrame.ActiveForm , PointCourant);

                               //forme.EstDans(Pointfinal);

                               //sapinDoc.TableauObjForm[2] = new Ellipse(Color.Coral,new System.Drawing.Rectangle(Pointfinal, TailleForme));;

                               sapinDoc.listeFormes.RemoveRange(1,1);

                               Invalidate();

                           break;

                        }

                 }

           }

    }

     

     

     

    pour supprimer mes objets mon ne marche pas

     

    Pour déplacer mes points je n'ai pas trouvé le code approprié.

     

    Merci pour vos suggestions

     

    Cordialement

     

    vendredi 24 août 2007 11:49
  • Vos formes, ont bien une propriété Rectangle (de System.Drawing) qui indique l'emplacement où elle se trouve (Rectangle.Location).

    Il suffit donc de faire un Rectangle.Offset() de cette propriété pour déplacer cette forme...

     

    Pour redessiner la forme, étant donnée que vous n'avez pas prévu dans votre méthode "Draw()" de redessiner une partie du dessin, vous être obligé d'invalider tout votre dessin via Control.Invalidate() (Control est le type de contrôle où est réalisé votre dessin...)

     

    Cordialement

     

     

     

    vendredi 24 août 2007 12:28
    Modérateur
  •  

    Bonjour,

    Merci beaucoup pour votre aide, un autre détaille, je sais maintenant que la souris se trouve au-dessus d'un cercle de ma liste, mais je ne sais pas identifier lequel voyez vous une astuce.

    Pour déplacer mes cercles je n'ai pas réussi, pouvez vous me dire plus ?

    Merci

    Très cordialement

    mardi 28 août 2007 12:33
  • foreach(Forme f in ...)

    {

        if (f.EstDans(PointClique) == true)

        {

              //Alors l'utilisateur a cliqué sur la forme qui est actuellement "f"

             

              //Pour déplacer cette forme, il suffit de faire (un truc du genre) :

              f.Rectange.OffSet(dx, dy);

              //Où dx et dy, les 2 vecteurs de directions sur l'axe x et y

         }

    }

     

    Cordialement

    mardi 28 août 2007 13:14
    Modérateur