Regg Fulton Ответов: 3

Как вращать многопоточные элементы управления на 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. Но тогда я потеряю все свои обработчики событий (я думаю), и это займет много переписывания кода. Прежде чем я начну это делать, я подумал, что спрошу у профессионалов!

3 Ответов

Рейтинг:
2

Patrice T

Ваш вопрос касается статьи на КП, лучше оставить комментарий внизу статьи
Вращающийся Элемент Управления PictureBox (Комментарии)[^]
Преимущество, автор будет замечен.
Я проверил, автор все еще активен на сайте.


Рейтинг:
12

Regg Fulton

Никаких предложений?
Ну, я нашел одно возможное решение. На самом деле он не вращает управление, но дает тот же эффект.
Вы можете создать пользовательский элемент управления фигурой. Видеть здесь: Форменные формы Windows и элементы управления в Visual Studio .NET.

Создайте четырехточечный многоугольник(или любую другую форму, которую вы хотите), а затем просто пересчитайте точки на основе угла поворота. Видеть Помощник В. Б.: методические указания: поворот точки в многоугольник[^].
Однако я решил пойти с графической матрицей, используя регионы для взаимодействия. Много кода нужно переписать, но рисование 100 полигонов гораздо эффективнее, чем рисование 100 графических блоков. Я лучше сделаю нормальную работу сейчас, чем потом буду сидеть над проблемой.


Рейтинг:
1

Regg Fulton

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


Patrice T

Не стоит спрашивать автора, так как он может быть знаком с вашей проблемой.

Regg Fulton

Спасибо, я последую твоему совету.

Patrice T

Вы не должны использовать решение для публикации комментария.
Вместо этого используйте кнопку "есть вопрос или комментарий?" под решением.

Regg Fulton

Моя вина. Первый раз отправляю. Должен ли я удалить его?

Patrice T

Весь интерес заключается в том, что тот, с кем вы разговариваете, замечается, когда вы используете эту кнопку. Но раз уж я сам это заметил, то вы сами видите, что делаете.
Вы можете удалить, если хотите, это зависит только от вас.