none
Dessiner un rectangle avec des angles arrondis RRS feed

  • Question

  • Bonjour,

    je cherche à dessiner un rectangle avec des angles arrondi autour par exemple d'un groupBox.

    Pour le moment je dessine le rectangle dans un évènement Paint de la façon suivante :

       Pen myPen = new Pen(Color.Black, 2);
       e.Graphics.DrawRectangle(myPen, groupBoxTableDécennale.ClientRectangle);

    Comment arrondir les angles ........ ?

    Merci d'avance


    BRI67

    mercredi 28 août 2013 12:59

Réponses

  • Bonjour à tous,

    Rectangle.Round effectue un arrondi, pas du rectangle dessiné mais des valeurs qui le composent.

    Il faut effectivement utiliser GraphicsPath et j'ai d'ailleurs trouvé sur le forum une réponse de Gilles TOURREAU dans ce sens.

    C'est donc ce que j'ai fait en généralisant le code proposé par Jacques pour pourvoir l'utiliser en évènement Paint pour tous mes GroupBox de la façon suivante :

    private void groupBoxPaint(object sender, PaintEventArgs e) { GroupBox gb = (GroupBox)sender; Rectangle rt = gb.ClientRectangle; int radius = 10; Pen p = new Pen(Color.Black, 2); GraphicsPath gp = new GraphicsPath(); gp.AddLine(rt.X + radius, rt.Y, rt.X + rt.Width - (radius * 2), rt.Y); gp.AddArc(rt.X + rt.Width - (radius * 2), rt.Y, radius * 2, radius * 2, 270, 90); gp.AddLine(rt.X + rt.Width, rt.Y + radius, rt.X + rt.Width, rt.Y + rt.Height - (radius * 2));

    gp.AddArc(rt.X + rt.Width - (radius * 2), rt.Y + rt.Height - (radius * 2), radius * 2, radius * 2, 0, 90);

    gp.AddLine(rt.X + rt.Width - (radius * 2), rt.Y + rt.Height, rt.X + radius, rt.Y + rt.Height); gp.AddArc(rt.X, rt.Y + rt.Height - (radius * 2), radius * 2, radius * 2, 90, 90); gp.AddLine(rt.X, rt.Y + rt.Height - (radius * 2), rt.X, rt.Y + radius); gp.AddArc(rt.X, rt.Y, radius * 2, radius * 2, 180, 90); gp.CloseFigure(); e.Graphics.DrawPath(p, gp); gp.Dispose(); }

    J'ai obtenu le résultat escompté et c'est très théorique car esthétiquement pour les angles c'est discutable.

    Merci à tous


    BRI67







    • Marqué comme réponse BRI_67 jeudi 29 août 2013 13:46
    • Modifié BRI_67 jeudi 29 août 2013 14:09
    jeudi 29 août 2013 13:43

Toutes les réponses

  • Bonjour BRI_67, 

    Je n'ai jamais essayé mais peut-être que la méthode Rectangle.Round fait ce que tu recherche? http://msdn.microsoft.com/en-us/library/system.drawing.rectangle.round.aspx

    Sinon tu peux toujours le dessiner manuellement , ce qui n'est peut-être pas efficace si tu prévoit en produire plusieurs.

    Évidemment il y a aussi l'utilisation de GraphicPath: http://tech.pro/tutorial/656/csharp-creating-rounded-rectangles-using-a-graphics-path


    • Modifié Mr.Alexz jeudi 29 août 2013 12:45 Mauvais lien
    mercredi 28 août 2013 14:12
  • Bonjour BRI67,

    Tu as ici un exemple Rounded Corner Rectangle , qui utilise System.Drawing.Drawing2D, et permet de choisir la 'courbure' des arrondis


    Cordialement, Jacques

    mercredi 28 août 2013 16:32
  • Bonjour à tous,

    Rectangle.Round effectue un arrondi, pas du rectangle dessiné mais des valeurs qui le composent.

    Il faut effectivement utiliser GraphicsPath et j'ai d'ailleurs trouvé sur le forum une réponse de Gilles TOURREAU dans ce sens.

    C'est donc ce que j'ai fait en généralisant le code proposé par Jacques pour pourvoir l'utiliser en évènement Paint pour tous mes GroupBox de la façon suivante :

    private void groupBoxPaint(object sender, PaintEventArgs e) { GroupBox gb = (GroupBox)sender; Rectangle rt = gb.ClientRectangle; int radius = 10; Pen p = new Pen(Color.Black, 2); GraphicsPath gp = new GraphicsPath(); gp.AddLine(rt.X + radius, rt.Y, rt.X + rt.Width - (radius * 2), rt.Y); gp.AddArc(rt.X + rt.Width - (radius * 2), rt.Y, radius * 2, radius * 2, 270, 90); gp.AddLine(rt.X + rt.Width, rt.Y + radius, rt.X + rt.Width, rt.Y + rt.Height - (radius * 2));

    gp.AddArc(rt.X + rt.Width - (radius * 2), rt.Y + rt.Height - (radius * 2), radius * 2, radius * 2, 0, 90);

    gp.AddLine(rt.X + rt.Width - (radius * 2), rt.Y + rt.Height, rt.X + radius, rt.Y + rt.Height); gp.AddArc(rt.X, rt.Y + rt.Height - (radius * 2), radius * 2, radius * 2, 90, 90); gp.AddLine(rt.X, rt.Y + rt.Height - (radius * 2), rt.X, rt.Y + radius); gp.AddArc(rt.X, rt.Y, radius * 2, radius * 2, 180, 90); gp.CloseFigure(); e.Graphics.DrawPath(p, gp); gp.Dispose(); }

    J'ai obtenu le résultat escompté et c'est très théorique car esthétiquement pour les angles c'est discutable.

    Merci à tous


    BRI67







    • Marqué comme réponse BRI_67 jeudi 29 août 2013 13:46
    • Modifié BRI_67 jeudi 29 août 2013 14:09
    jeudi 29 août 2013 13:43