Myeager1249 Ответов: 1

Как нарисовать круги на picturebox в VB.NET использование точек из базы данных?


У меня есть коробка с картинками с загруженным изображением. У меня есть 2 способа, которыми я хочу нарисовать круги на изображении. Первый - это щелчок мышью по изображению. Как только щелчок мыши срабатывает, он сохраняет точки в базе данных и рисует круг. Это прекрасно работает.

Private Sub InjectionSites_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FaceImage.MouseClick
        Dim sSql As String
        Dim MyPoint As New Point

        MyPoint.X = e.X
        MyPoint.Y = e.Y

        MarkLocationOnFace(MyPoint)

        sSql = "insert into Injections (x, y, custid, date, units)"
        sSql = sSql & " values (" & e.X & ", " & e.Y & ", 1, '" & Now() & "', 2)"
        Conn.Execute(sSql)

    End Sub

    Private Sub MarkLocationOnFace(ByVal myPoint As Point)
        Dim p As New System.Drawing.Pen(Brushes.Black, 4)
        Dim g As System.Drawing.Graphics

        g = FaceImage.CreateGraphics
        g.DrawEllipse(p, myPoint.X, myPoint.Y, 10, 10)

    End Sub



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

Private Sub LoadPreviousVisit(ByVal MyDate As Date, ByVal CustID As Decimal)
        Dim sSql As String
        Dim rs As New ADODB.Recordset
        Dim mypoint As New Point

        sSql = "Select * from Injections where CustID = " & CustID
        sSql = sSql & " and CONVERT(VARCHAR(10),date,101) = '"
        sSql = sSql & MyDate.ToString("MM/dd/yyyy") & "'"
        rs.Open(sSql, Conn)

        Do While Not rs.EOF
            mypoint.X = rs("X").Value
            mypoint.Y = rs("Y").Value

            MarkLocationOnFace(mypoint)
            rs.MoveNext()
        Loop
        FaceImage.SendToBack()
    End Sub


Что я уже пробовал:

Отправка коробки с картинками на заднюю панель тоже не работает.

Maciej Los

Попробуйте использовать: PictureBox.Метод Invalidate (System.Окна.Формы)[^]

1 Ответов

Рейтинг:
1

OriginalGriff

Это потому, что вы рисуете на picturebox, но не в нужном месте. Есть два способа исправить это:
1) опираться на изображение, что элемент управления PictureBox, что элемент управления PictureBox отображается, и вызвать invalidate на элемент управления PictureBox.
2) Нарисуйте на самом PictureBox вместо этого в его событии Paint, используя графический объект, переданный вам в параметре PaintArge. Снова сделайте недействительным PictureBox каждый раз, когда вы добавляете точку, чтобы нарисовать ее.

- Я? Я бы добавил список точечных объектов, к которым я добавляю каждое новое местоположение, и нарисовал их в событии PictureBox Paint (это намного быстрее, чем каждый раз обращаться к БД, а обработчики рисования должны быть как можно короче)

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


Myeager1249

Спасибо за вашу помощь! Это решило проблему, и вы правы, построение списка пунктов-гораздо лучший план.

OriginalGriff

Всегда пожалуйста!