RoundRectangle.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing

'' このサンプルは、専用の DrawRoundRect/FillRoundRect メソッドを使用して
'' 角丸の四角形を描く方法を示します。
'' また、グラフィックパスでどのように同じ結果が得られるかを示します。
Public Class RoundRectangle
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

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

        '' 角丸四角形の半径。
        Dim rx = 36, ry = 24

        '' 専用のメソッドを使用して角丸の四角形を描画し塗りつぶします。
        Dim 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)
        '' ラベルを追加します。
        Dim tf = New TextFormat() With {.FontName = "Yu Gothic", .FontSize = 14}
        g.DrawString("簡単な方法", tf, rEasy, TextAlignment.Center, ParagraphAlignment.Center, False)

        '' グラフィックパスを使用して同じ結果を得ます。
        Dim rHard = rEasy
        rHard.Offset(0, rEasy.Height + 36)
        Dim 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
    End Function

    '' このメソッドは、GcGraphics で任意の図形を塗りつぶしたり描画したり
    '' するために使用できるグラフィックスパスを作成する方法を示します。
    Private Function MakeRoundRect(ByVal g As GcGraphics, ByVal rc As RectangleF, ByVal rx As Single, ByVal ry As Single) As IPath
        Dim path = g.CreatePath()
        Dim 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() With {.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() With {.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() With {.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() With {.Point = New PointF(rc.Left + rx, rc.Top), .SweepDirection = SweepDirection.Clockwise, .Size = sz})
        path.EndFigure(FigureEnd.Closed)
        Return path
    End Function
End Class