0

我正在尝试创建一个带有圆形矩形和底部的东西的弹出气泡,我在下面的图像中用绿色圈出:

在此处输入图像描述

但正如你已经猜到的那样,这不是我想要的样子,而是:

在此处输入图像描述

我想出了如何按我应该的方式绘制它,但在这种情况下,当我在路径周围添加边框时,它会将那个小三角形和圆角矩形分开。

这是我正在使用的代码:

public static GraphicsPath CreateBubblePath(Rectangle rect, int radius)
{
    GraphicsPath p = new GraphicsPath();
    GraphicsPath p2 = new GraphicsPath();
    p.StartFigure();
    p2.StartFigure();

    int pointHeigt = 3 * radius;

    //Top Left Corner
    p.AddArc(rect.X, rect.Y, 2 * radius, 2 * radius, 180, 90);

    //Top Edge
    p.AddLine(rect.X + radius, rect.Y, rect.X + rect.Width - radius, rect.Y);

    //Top Right Corner
    p.AddArc(rect.X + rect.Width - 2 * radius, rect.Y, 2 * radius, 2 * radius, 270, 90);


    //Right Edge
    p.AddLine(rect.X + rect.Width, rect.Y + radius, rect.X + rect.Width, rect.Y + rect.Height - radius - pointHeigt);

    //Bottom Right Corner
    p.AddArc(rect.X + rect.Width - (2 * radius), rect.Y + rect.Height - radius - pointHeigt, 2 * radius, 2 * radius, 0, 90);

    //Bottom Edge 1/2
    //METHOD 1
    p.AddLine(rect.X + rect.Width - radius, rect.Y + rect.Height - 2 * radius, rect.X + (rect.Width / 2) + pointHeigt, rect.Y + rect.Height - 2 * radius);

    p.AddArc(rect.X + (rect.Width / 2), rect.Y + rect.Height - 2 * radius , pointHeigt, pointHeigt, 180, 90);
    p.AddArc(rect.X + (rect.Width / 2) - pointHeigt, rect.Y + rect.Height - 2 * radius, pointHeigt, pointHeigt, 270, 90);

    p.AddLine(rect.X + (rect.Width / 2) - pointHeigt, rect.Y + rect.Height - 2 * radius, rect.X + radius, rect.Y + rect.Height - 2 * radius);

    //METHOD 2///////////////////////////////////////
    //p.AddLine(rect.X + rect.Width - radius, rect.Y + rect.Height - 2 * radius, rect.X + radius, rect.Y + rect.Height - 2 * radius);
    //p2.AddArc(rect.X + (rect.Width / 2), rect.Y + rect.Height - 2 * radius, pointHeigt, pointHeigt, 180, 90);
    //p2.AddArc(rect.X + (rect.Width / 2) - pointHeigt, rect.Y + rect.Height - 2 * radius, pointHeigt, pointHeigt, 270, 90);
    //p2.CloseFigure();
    ////////////////////////////////

    //Bottom Left Corner
    p.AddArc(rect.X, rect.Y + rect.Height - radius - pointHeigt, 2 * radius, 2 * radius, 90, 90);

    //Left Edge
    p.AddLine(rect.X, rect.Y + rect.Height - radius - pointHeigt, rect.X, rect.Y + radius);

    p.CloseFigure();
    //METHOD 2
    //p.AddPath(p2, true);
    return p;
}
4

2 回答 2

1

我认为弧的角度是问题所在。

我将它们更改为:

p.AddArc(rect.X + (rect.Width / 2), rect.Y + rect.Height - 2 * radius, pointHeigt, pointHeigt, 270, -90);
p.AddArc(rect.X + (rect.Width / 2) - pointHeigt, rect.Y + rect.Height - 2 * radius, pointHeigt, pointHeigt, 0, -90);

现在矩形底部的点看起来是正确的。

有关圆弧角度的信息可以在GraphicsPath.AddArc 的 MSDN 页面上找到,特别是在备注部分:

圆弧沿着以指定矩形为界的椭圆的周长绘制。圆弧的起点是通过从椭圆的 x 轴(在 0 度角)顺时针测量起点角的度数来确定的。通过从起点顺时针测量扫描角的度数来类似地定位端点。如果扫掠角大于 360 度或小于 -360 度,则圆弧分别扫掠 360 度或 -360 度。

于 2014-06-12T13:29:39.857 回答
0

好的,所以我不知道我可以在sweepAngle 中添加一个负数,所以我知道我只更改了以下两行:

p.AddArc(rect.X + (rect.Width / 2), rect.Y + rect.Height - 2 * radius , pointHeigt, pointHeigt, 180, 90);
p.AddArc(rect.X + (rect.Width / 2) - pointHeigt, rect.Y + rect.Height - 2 * radius, pointHeigt, pointHeigt, 270, 90);

到:

    p.AddArc(rect.X + (rect.Width / 2), rect.Y + rect.Height - 2 * radius , pointHeigt, pointHeigt, 270, -90);
    p.AddArc(rect.X + (rect.Width / 2) - pointHeigt, rect.Y + rect.Height - 2 * radius, pointHeigt, pointHeigt, 0, -90);
于 2014-06-12T13:28:50.833 回答