RoundRectangle.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos
{
    // このサンプルは、専用の DrawRoundRect/FillRoundRect メソッドを使用して
    // 角丸の四角形を描く方法を示します。
    // また、グラフィックパスでどのように同じ結果が得られるかを示します。
    public class RoundRectangle
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;

            var rc = Common.Util.AddNote(
                "GcPdfGraphicsには、角丸の四角形を簡単に描画して塗りつぶす専用のメソッドがあります。" +
                "このサンプルは、グラフィックスパスを使用して同じ結果を得る方法も示しています。" +
                "丸い矩形を描くためには不要ですが、グラフィックスパスは、" +
                "任意の図形を複雑な図形で描き、塗りつぶすことができます。",
                page);

            // 角丸四角形の半径。
            float rx = 36, ry = 24;

            // 専用のメソッドを使用して角丸の四角形を描画し塗りつぶします。
            var rEasy = new RectangleF(rc.Left, rc.Bottom + 36, 144, 72);
            g.FillRoundRect(rEasy, rx, ry, Color.PaleGreen);
            g.DrawRoundRect(rEasy, rx, ry, Color.Blue, 4);
            // ラベルを追加します。
            var tf = new TextFormat() { Font = Common.Util.getFont(), FontSize = 14 };
            g.DrawString("簡単な方法", tf, rEasy, TextAlignment.Center, ParagraphAlignment.Center, false);

            // グラフィックパスを使用して同じ結果を得ます。
            var rHard = rEasy;
            rHard.Offset(0, rEasy.Height + 36);
            var path = MakeRoundRect(g, rHard, rx, ry);
            g.FillPath(path, Color.PaleVioletRed);
            g.DrawPath(path, Color.Purple, 4);
            // ラベルを追加します。
            g.DrawString("難しい方法", tf, rHard, TextAlignment.Center, ParagraphAlignment.Center, false);

            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }

        // このメソッドは、GcGraphics で任意の図形を塗りつぶしたり描画したり
        // するために使用できるグラフィックスパスを作成する方法を示します。
        private static IPath MakeRoundRect(GcGraphics g, RectangleF rc, float rx, float ry)
        {
            var path = g.CreatePath();
            var sz = new SizeF(rx, ry);
            // 左上隅から開始。
            path.BeginFigure(new PointF(rc.Left + rx, rc.Top));
            path.AddLine(new PointF(rc.Right - rx, rc.Top));
            path.AddArc(new ArcSegment() { Point = new PointF(rc.Right, rc.Top + ry), SweepDirection = SweepDirection.Clockwise, Size = sz });
            path.AddLine(new PointF(rc.Right, rc.Bottom - ry));
            path.AddArc(new ArcSegment() { Point = new PointF(rc.Right - rx, rc.Bottom), SweepDirection = SweepDirection.Clockwise, Size = sz });
            path.AddLine(new PointF(rc.Left + rx, rc.Bottom));
            path.AddArc(new ArcSegment() { Point = new PointF(rc.Left, rc.Bottom - ry), SweepDirection = SweepDirection.Clockwise, Size = sz });
            path.AddLine(new PointF(rc.Left, rc.Top + ry));
            path.AddArc(new ArcSegment() { Point = new PointF(rc.Left + rx, rc.Top), SweepDirection = SweepDirection.Clockwise, Size = sz });
            path.EndFigure(FigureEnd.Closed);
            return path;
        }
    }
}