Как динамически создать наложение поверх PictureBox VB.Net - PullRequest
1 голос
/ 17 марта 2011

У меня есть VB.Net PictureBox floorPlanImage в форме form1.

Я загружаю изображение в поле:

    floorPlanImage.image = my.resources.ResourceManager.GetObject("level8") 'this is actually dynamic, and this part works

Я пытаюсь создать оверлейчтобы выделить область изображения:

    Public Sub highlightPrintArea(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer)
    '**** DOES NOT WORK
    Dim g As Graphics = Me.CreateGraphics
    Dim r As Rectangle = New Rectangle(x1, y1, x2 - x1, y2 - y1) 'these are args passed in to the function
    Dim pen As Pen = New Pen(Color.FromArgb(128, 32, 100, 200), 1) 'semi-transparent
    Dim b As Brush = New SolidBrush(pen.Color)

    g.FillRectangle(b, r)
    end sub

Мне нужно сделать это динамически во время выполнения, скажем, по нажатию кнопки.Вышеупомянутая функция, кажется, не рисует прямоугольник.

Однако, если у меня есть функция, которая Handles floorPlanImage.Paint похожа на следующую, тогда прямоугольник рисуется так, как я ожидаю:

Private Sub floorPlanImage_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles floorPlanImage.Paint
    '**** Works, but does not suit my workflow
    Dim g As Graphics = e.Graphics
    Dim r As Rectangle = New Rectangle(100, 100, 100, 100)
    Dim pen As Pen = New Pen(Color.FromArgb(128, 32, 100, 200), 1)
    Dim b As Brush = New SolidBrush(pen.Color)

    g.FillRectangle(b, r)
End Sub

Вопрос (наконец-то)

Как я могу изменить мою функцию onclick для правильного наложения прямоугольника на мой PictureBox?

1 Ответ

4 голосов
/ 18 марта 2011

В событии onclick вам нужно сохранить местоположение / точку в переменной-члене и установить флаг, чтобы приложение знало, что вы сохранили местоположение.Чтобы обновить окно рисунка, вызовите Invalidate and Update.

floorPlanImage.Invalidate()
floorPlanImage.Update()

В тесте события onpaint отметьте, что у вас есть точка, затем используйте сохраненную точку, чтобы нарисовать наложение.

Private Sub floorPlanImage_Paint(ByVal sender As Object, ByVal e As  System.Windows.Forms.PaintEventArgs) Handles floorPlanImage.Paint
    If hasPoint

       'Draw with saved point
    End If
End Sub
...