Как вращать многопоточные элементы управления на picturebox
Здоровается со всеми. В течение многих лет я посещал форум в поисках ответов, и мне никогда не нужно было задавать вопрос, как это всегда было задано раньше с отличными ответами! Я привык к приложениям баз данных и графическим интерфейсам. Однако в моем последнем проекте мне нужно начать играть с живописью и графикой.
В моем проекте у меня есть коробка с картинками, представляющая пол. Затем несколько картинных коробок внутри него, представляющих полки. Теперь мне нужно иметь возможность поворачивать полки на любой определенный пользователем угол.
Что я уже пробовал:
Я посмотрел на это:
Вращающийся Элемент Управления PictureBox[^]
но это создает прозрачный контроль, который больше, чем изображение. Это испортит мою проверку столкновений, так что я не смогу поставить две угловые полки, соприкасающиеся друг с другом.
Что у меня есть:
Я создал класс "MyPicturebox", наследующий picturebox, и установил пользовательские свойства:
Public Class MyPictureBox Inherits PictureBox 'Shelf Position and Orientation Private _ShelfID As Integer Private _ShelfRotation As Single '... <CategoryAttribute("Custom"), _ Browsable(True), _ [ReadOnly](False), _ DescriptionAttribute("Angle of rotation.")> _ Public Property ShelfRotation() As Single Get Return _ShelfRotation End Get Set(ByVal value As Single) _ShelfRotation = value End Set End Property 'And a bunch of other properties 'I have a custom paint event: Private Sub MyPictureBox_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim g As Graphics = e.Graphics Dim thisWidth, thisHeight As Integer If _shelfBBorderBrush = "Solid" Then Dim BorderBrush As New SolidBrush(_ShelfBorderColor) g.FillRectangle(BorderBrush, 0, 0, thisWidth, thisHeight) ElseIf _shelfBBorderBrush = "Gradient" Then Dim BorderBrush As New System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, _ShelfBorderColor, _ShelfBorderColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical) g.FillRectangle(BorderBrush, 0, 0, thisWidth, thisHeight) End If End Sub
Пока все это работает. Я могу создавать, редактировать, рисовать и перемещать элементы управления без каких-либо проблем. На моей форме я делаю обнаружение столкновений с:
For Each picItem As MyPictureBox In picFloor.Controls If sender.Bounds.IntersectsWith(picItem.Bounds) Then If picItem.Tag = sender.Tag Then 'Colliding with self Else 'Collision!!! sender.left = oldX sender.top = oldY End If End If Next 'My class is added to the floor on a button click: Private Sub cmdAddShelf1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAddShelf1.Click ReDim Preserve cmdShelf(shelfCount) cmdShelf(shelfCount - 1) = New MyPictureBox With cmdShelf(shelfCount - 1) .Tag = shelfCount - 1 .ShelfName = "Shelf_" & shelfCount - 1 '... .Size = New Size((numDWidth.Value * mScale), (numDDepth.Value * mScale)) .Location = New Point(DropPannel.HorizontalScroll.Value + BorderBuffer, DropPannel.VerticalScroll.Value + BorderBuffer) ' End With AddHandler cmdShelf(shelfCount - 1).MouseWheel, AddressOf PictureBox_MouseWheel AddHandler cmdShelf(shelfCount - 1).MouseMove, AddressOf PictureBox_MouseMove AddHandler cmdShelf(shelfCount - 1).MouseClick, AddressOf PictureBox_Click AddHandler cmdShelf(shelfCount - 1).MouseDown, AddressOf Button_Down AddHandler cmdShelf(shelfCount - 1).MouseUp, AddressOf Button_Up AddHandler cmdShelf(shelfCount - 1).MouseEnter, AddressOf MEnter AddHandler cmdShelf(shelfCount - 1).MouseLeave, AddressOf MLeave End Sub
Итак, как я могу повернуть элемент управления, не меняя его размер или видимость?
Мой следующий вариант-избавиться от графических блоков и работать только с графикой на одном picturebox. Но тогда я потеряю все свои обработчики событий (я думаю), и это займет много переписывания кода. Прежде чем я начну это делать, я подумал, что спрошу у профессионалов!