我创建了一个小函数,它绘制了一个边缘更细的Rectangle。 (你可以称之为圆角矩形)
我是这样做的:
$scope
这是调用此函数的Paint事件处理程序:
private void DrawRoundedRectangle(Graphics G, int X1, int Y1, int X2, int Y2)
{
GraphicsPath GP =new GraphicsPath();
GP.AddLine(X1+1,Y1 , X2-1,Y1 );
GP.AddLine(X2-1,Y1 , X2 ,Y1+1);
GP.AddLine(X2 ,Y1+1, X2 ,Y2-1);
GP.AddLine(X2 ,Y2-1, X2-1,Y2 );
GP.AddLine(X2-1,Y2 , X1+1,Y2 );
GP.AddLine(X1+1,Y2 , X1 ,Y2-1);
GP.AddLine(X1 ,Y2-1, X1 ,Y1+1);
GP.AddLine(X1 ,Y1+1, X1+1,Y1 );
G.DrawPath(Pens.Blue,GP);
}
运行它,确实给出了所需的结果,这就是:
我希望得到一个好结果。
但是如果我改变了
private void Form1_Paint(object sender, PaintEventArgs e)
{
this.DrawRoundedRectangle(e.Graphics,50,50,60,55);
}
行:
G.DrawPath(Pens.Blue,GP);
那么我得到的是:
不是我想要的结果..
矩形的底部是尖锐的,并且不需要像使用DrawPath()方法那样进行舍入。
任何人都知道如何使FillPath()方法也能正常工作? 如果重要,我使用的是.NET Framework 2.0。
答案 0 :(得分:1)
如果您想要真正的圆角矩形实现,则应使用commenter blas3nik上Oddly drawn GraphicsPath with Graphics.FillPath引用的问题中的代码。
您的实现主要是删除四个角上的每个像素。因此,没有必要使用GraphicsPath
来绘制它。只需填写几个不包含这些像素的重叠矩形:
private void FillRoundedRectangle(Graphics G, int X1, int Y1, int X2, int Y2)
{
int width = X2 - X1, height = Y2 - Y1;
G.FillRectangle(Brushes.Blue, X1 + 1, Y1, width - 2, height);
G.FillRectangle(Brushes.Blue, X1, Y1 + 1, width, height - 2);
}