Я создал пользовательский элемент управления, который можно использовать как форму круга / квадрата / треугольника, элемент управления может рисовать границу (внешнюю) и заполнять то, что находится внутри этой границы (внутреннее)
Чтобы понять это:
Граница черная, а внутренняя - красная.
Что ж, теперь я хотел бы добавить в свой элемент управления функцию для заполнения внутренней части формы с помощью изображения.
но когда я пытаюсь заполнить только это пространство с помощью изображения, также отображается внешняя область фигуры:
Я не эксперт в использовании GDI +, как я могу это исправить?
Мне нужно сделать это с помощью круга, квадрата и треугольника, я не знаю, можно ли это остановить.
Это код, который я использую, чтобы заполнить круг изображением:
Public Property InnerImage As Image = Image.FromFile("C:\random.jpg")
''' <summary>
''' Draws a circle on the specified <see cref="System.Drawing.Graphics"/> object.
''' </summary>
''' <param name="g">The <see cref="System.Drawing.Graphics"/> object to draw.</param>
Private Sub DrawCircle(ByRef g As Graphics)
With g
Using pen As New Pen(Me._BorderColor, Me._BorderWidth)
Dim rect As Rectangle = Me.GetFigueRectangle(pen)
' Fill the circle using the image.
If Me.InnerImage IsNot Nothing Then
.DrawImage(Me.InnerImage, rect)
Else ' Fill the circle using a solid colour.
If Not Me._InnerColor = Color.Transparent Then
Using brush As New SolidBrush(Me._InnerColor)
.FillEllipse(brush, rect)
End Using
End If ' Not Me._InnerColor = Color.Transparent
End If
' Draw the circle border.
.DrawEllipse(pen, rect)
End Using ' pen As New Pen(Me._BorderColor, Me._BorderWidth)
End With ' g
End Sub
И функция GetFigueRectangle
(которая используется как для круга, так и для квадрата и треугольника) такова:
''' <summary>
''' Gets a <see cref="System.Drawing.Rectangle"/> with the bounds fixed according to the specified <see cref="System.Drawing.Pen.Width"/>.
''' </summary>
''' <param name="pen">The <see cref="System.Drawing.Pen"/>.</param>
''' <returns>The <see cref="System.Drawing.Rectangle"/> with the bounds fixed.</returns>
Private Function GetFigueRectangle(ByVal pen As Pen) As Rectangle
Return New Rectangle With
{
.x = CInt(0.0F + (pen.Width / 2.0F)),
.y = CInt(0.0F + (pen.Width / 2.0F)),
.width = CInt(MyBase.Width - pen.Width),
.height = CInt(MyBase.Height - pen.Width)
}
End Function