Как преобразовать фигуру в VB.NET - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь сначала нарисовать фигуру (что я уже сделал), а затем преобразовать ее, например, по выбору пользователя, повернуть на определенный угол или масштабировать, показывая эту оригинальную форму и вновь преобразованную форма.

Я попробовал следующее при попытке поворота:

Private Sub paint_box_Paint(sender As Object, e As PaintEventArgs) Handles paint_box.Paint
    Dim x As Integer = paint_box.Size.Width / 2
    Dim y As Integer = paint_box.Size.Height / 2

    Dim rect As New Rectangle(x, y, 80, 80)

    ' Create pen.
    Dim blackPen As New Pen(Color.Black, 3)
    ' Create pen.
    Dim redPen As New Pen(Color.Red, 3)
    e.Graphics.DrawRectangle(blackPen, rect)
End Sub

Я ожидал, что эта форма будет напечатана на Form.Load, чтобы повернуть на указанный угол 30.0F

1 Ответ

2 голосов
/ 10 мая 2019

Когда мы хотим рисовать на поверхности элемента управления, нам нужно подписаться на событие 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

Пример результатов:

Graphis DrawRectangle Matrix RotateAt

Весь код, используемый для рисования иповернуть форму:

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
...