Когда мы хотим рисовать на поверхности элемента управления, нам нужно подписаться на событие Paint элемента управления (не все элементы управления предоставляют это событие: например, элементы управления TextBox этого не делают. Мы можем получитьПользовательский класс Control из TextBox и переопределяет метод OnPaint
. Однако, это может разочаровать).
Чтобы нарисовать и повернуть фигуру, нам нужны поля или свойства для хранения ссылок на объекты / значения, которые мы используем для рисования.Здесь только объект Rectangle
, который обеспечивает меру формы, и поле single
для хранения угла поворота.
Private drawingRect As Rectangle = New Rectangle(50, 50, 100, 100)
Private rotationAngle As Single = 0.0F
Эти ссылки позволяют изменять форму объекта и угол поворота при необходимости.Когда эти значения изменяются, нам просто нужно вызвать метод Invalidate () элемента управления, чтобы вызвать его событие Paint
.
В Form.Load()
(или в конструкторе формы - Public Sub New()
) мы можем определить начальную позицию и размер формы, если это необходимо:
Public Sub New()
InitializeComponent()
drawingRect = New Rectangle(50, 50, 100, 100)
End Sub
Когда мы меняем мерыформы, чтобы обновить чертеж, мы вызываем метод Control Invalidate()
.Здесь поверхность рисования обеспечивается элементом управления GroupBox.
На Button.Click()
мы обновляем форму новыми значениями, вызывая GroupBox.Invalidate()
.Чертеж будет немедленно обновлен:
Private Sub btnRotate_Click(sender As Object, e As EventArgs) Handles btnRotate.Click
' Rotate the shape 45 degrees
rotationAngle = 45
GroupBox1.Invalidate()
End Sub
Чтобы повернуть фигуру, мы можем использовать два простых метода: метод Graphics.RotateTransform или Matrix.RotateAt () метод.
Я использую последний: он очень прост в использовании, он принимает угол, выраженный в градусах, и нам просто нужно предоставить координаты вращения.
Здесь форма поворачиваетсяиспользуя координаты его центральной точки:
Using m As Matrix = New Matrix
m.RotateAt(rotationAngle, New PointF(drawingRect.X + (drawingRect.Width / 2.0F),
drawingRect.Y + (drawingRect.Height / 2.0F)))
e.Graphics.Transform = m
e.Graphics.DrawRectangle(pen, drawingRect)
End Using
Пример результатов:
Весь код, используемый для рисования иповернуть форму:
Public Class Form1
Private drawingRect As Rectangle = Rectangle.Empty
Private rotationAngle As Single = 0.0F
Public Sub New()
InitializeComponent()
drawingRect = New Rectangle(50, 50, 100, 100)
End Sub
Private Sub GroupBox1_Paint(sender As Object, e As PaintEventArgs) Handles GroupBox1.Paint
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
Using pen As Pen = New Pen(Color.LightGreen, 4)
Using m As Matrix = New Matrix
m.RotateAt(rotationAngle, New PointF(drawingRect.X + (drawingRect.Width / 2.0F),
drawingRect.Y + (drawingRect.Height / 2.0F)))
e.Graphics.Transform = m
e.Graphics.DrawRectangle(pen, drawingRect)
End Using
End Using
End Sub
Private Sub btnPaint_Click(sender As Object, e As EventArgs) Handles btnPaint.Click
' Redefine the shape and redraw it
drawingRect.Location = New Point(100, 100)
drawingRect.Size = New Size(200, 300)
GroupBox1.Invalidate()
End Sub
Private Sub btnRotate_Click(sender As Object, e As EventArgs) Handles btnRotate.Click
' Rotate the shape 45 degrees
rotationAngle = 45
GroupBox1.Invalidate()
End Sub
End Class