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 に負の数を追加できることを知らなかったので、次の 2 行だけを変更したことを知りました。

から

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 に答える