Trying to get that center area filled, not sure what I'm doing wrong.
Imports System.Drawing.Drawing2D
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim gp As GraphicsPath = CreatePath(New Rectangle(New Point(200, 200), New Size(250, 100)))
e.Graphics.FillPath(New SolidBrush(Color.LightBlue), gp)
e.Graphics.DrawPath(New Pen(Color.Black), gp)
End Sub
Private Function CreatePath(ByVal area As Rectangle) As GraphicsPath
Dim gp As New GraphicsPath()
Dim rect As Rectangle = New Rectangle(area.Location, New Size(area.Width, area.Height \ 3))
gp.AddEllipse(rect)
Dim hadj As Integer = area.Height \ 4
gp.AddLine(New Point(area.X, area.Y + area.Height - hadj), New Point(area.X, area.Y + (rect.Height \ 3) + 8))
Dim gh As Integer = area.Width \ 4
Dim pts(4) As PointF
pts(0) = New PointF(area.X, area.Y + area.Height - hadj)
pts(1) = New Point(area.X + gh, area.Y + area.Height - (hadj \ 2))
pts(2) = New Point(area.X + gh * 2, area.Y + area.Height - (hadj \ 3))
pts(3) = New Point(area.X + gh * 3, area.Y + area.Height - (hadj \ 2))
pts(4) = New Point(area.X + area.Width, area.Y + area.Height - hadj)
gp.AddCurve(pts)
gp.AddLine(New PointF(area.X + area.Width, area.Y + (rect.Height \ 3) + 9), New PointF(area.X + area.Width, area.Y + area.Height - hadj))
Return gp
End Function
End Class
Try the following. By default the GraphicsPath uses an alternating fill mode which alternately adds/subtracts from the fill. Winding fill mode uses the direction to add (clockwise) or subtract (counter clockwise) from the fill.
Private Function CreatePath(ByVal area As Rectangle) As GraphicsPath
'* Set fill mode to winding (see FillMode Help)
Dim gp As New GraphicsPath(FillMode.Winding)
Dim rect As Rectangle = New Rectangle(area.Location, New Size(area.Width, area.Height \ 3))
gp.AddEllipse(rect)
'* Reorder points so that path goes clockwise (see FillMode.Winding Help)
Dim hadj As Integer = area.Height \ 4
'Left side bottom -> top
'gp.AddLine(New Point(area.X, area.Y + area.Height - hadj), New Point(area.X, area.Y + (rect.Height \ 3) + 8))
'* Right side top -> bottom (clockwise)
'* NOTE: Top Y value was a bit too high, adjusted by -3. Adjust calculation or maybe use floating point math and used rounding, ceil, or floor
gp.AddLine(New PointF(area.X + area.Width, area.Y + (rect.Height \ 3) + 9 - 3), New PointF(area.X + area.Width, area.Y + area.Height - hadj))
Dim gh As Integer = area.Width \ 4
Dim pts(4) As PointF
'pts(0) = New PointF(area.X, area.Y + area.Height - hadj)
'pts(1) = New Point(area.X + gh, area.Y + area.Height - (hadj \ 2))
'pts(2) = New Point(area.X + gh * 2, area.Y + area.Height - (hadj \ 3))
'pts(3) = New Point(area.X + gh * 3, area.Y + area.Height - (hadj \ 2))
'pts(4) = New Point(area.X + area.Width, area.Y + area.Height - hadj)
'* Reordered points (clockwise)
pts(0) = New Point(area.X + area.Width, area.Y + area.Height - hadj)
pts(1) = New Point(area.X + gh * 3, area.Y + area.Height - (hadj \ 2))
pts(2) = New Point(area.X + gh * 2, area.Y + area.Height - (hadj \ 3))
pts(3) = New Point(area.X + gh, area.Y + area.Height - (hadj \ 2))
pts(4) = New PointF(area.X, area.Y + area.Height - hadj)
gp.AddCurve(pts)
'Right side top -> bottom
'gp.AddLine(New PointF(area.X + area.Width, area.Y + (rect.Height \ 3) + 9), New PointF(area.X + area.Width, area.Y + area.Height - hadj))
'* Left side bottom -> top (clockwise)
'* NOTE: Top Y value was a bit too high, adjusted by -2. Adjust calculation or maybe use floating point math and used rounding, ceil, or floor
gp.AddLine(New Point(area.X, area.Y + area.Height - hadj), New Point(area.X, area.Y + (rect.Height \ 3) + 8 - 2))
Return gp
End Function