2009-03-09 6 views
17

Ich habe eine Methode, die ein abgerundetes Rechteck mit einem Rand zeichnet. Die Grenze kann eine beliebige Breite haben. Das Problem, das ich habe, ist, dass die Grenze über die angegebenen Grenzen hinausreicht, wenn sie dick ist, weil sie aus der Mitte eines Pfades gezogen wird.Wie zeichne abgerundetes Rechteck mit variabler Breite Rahmen innerhalb bestimmter Grenzen

Wie würde ich die Breite der Umrandung einschließen, so dass sie perfekt in die angegebenen Grenzen passt?

Hier ist der Code, den ich verwende, um das abgerundete Rechteck zu zeichnen.

private void DrawRoundedRectangle(Graphics gfx, Rectangle Bounds, int CornerRadius, Pen DrawPen, Color FillColor) 
{ 
    GraphicsPath gfxPath = new GraphicsPath(); 

    DrawPen.EndCap = DrawPen.StartCap = LineCap.Round; 

    gfxPath.AddArc(Bounds.X, Bounds.Y, CornerRadius, CornerRadius, 180, 90); 
    gfxPath.AddArc(Bounds.X + Bounds.Width - CornerRadius, Bounds.Y, CornerRadius, CornerRadius, 270, 90); 
    gfxPath.AddArc(Bounds.X + Bounds.Width - CornerRadius, Bounds.Y + Bounds.Height - CornerRadius, CornerRadius, CornerRadius, 0, 90); 
    gfxPath.AddArc(Bounds.X, Bounds.Y + Bounds.Height - CornerRadius, CornerRadius, CornerRadius, 90, 90); 
    gfxPath.CloseAllFigures(); 

    gfx.FillPath(new SolidBrush(FillColor), gfxPath); 
    gfx.DrawPath(DrawPen, gfxPath); 
} 

Antwort

29

In Ordnung Jungs, ich habe es herausgefunden! Sie müssen nur die Grenzen verkleinern, um die Breite des Stifts zu berücksichtigen. Ich wusste irgendwie, dass dies die Antwort war. Ich habe mich nur gefragt, ob es eine Möglichkeit gibt, eine Linie auf der Innenseite eines Pfades zu zeichnen. Das funktioniert aber gut.

private void DrawRoundedRectangle(Graphics gfx, Rectangle Bounds, int CornerRadius, Pen DrawPen, Color FillColor) 
{ 
    int strokeOffset = Convert.ToInt32(Math.Ceiling(DrawPen.Width)); 
    Bounds = Rectangle.Inflate(Bounds, -strokeOffset, -strokeOffset); 

    DrawPen.EndCap = DrawPen.StartCap = LineCap.Round; 

    GraphicsPath gfxPath = new GraphicsPath(); 
    gfxPath.AddArc(Bounds.X, Bounds.Y, CornerRadius, CornerRadius, 180, 90); 
    gfxPath.AddArc(Bounds.X + Bounds.Width - CornerRadius, Bounds.Y, CornerRadius, CornerRadius, 270, 90); 
    gfxPath.AddArc(Bounds.X + Bounds.Width - CornerRadius, Bounds.Y + Bounds.Height - CornerRadius, CornerRadius, CornerRadius, 0, 90); 
    gfxPath.AddArc(Bounds.X, Bounds.Y + Bounds.Height - CornerRadius, CornerRadius, CornerRadius, 90, 90); 
    gfxPath.CloseAllFigures(); 

    gfx.FillPath(new SolidBrush(FillColor), gfxPath); 
    gfx.DrawPath(DrawPen, gfxPath); 
} 
Verwandte Themen