首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在picturebox中绘制简单的矩形

无法在picturebox中绘制简单的矩形
EN

Stack Overflow用户
提问于 2014-09-15 18:44:31
回答 1查看 1.8K关注 0票数 0

我有一个能显示图像的图片框。我希望用户能够点击,拖动,鼠标到图像上的一个矩形。比如“我想用我在这张图片上画的矩形来做一些事情”。如果它们再次单击,我希望前面的矩形消失,然后重新开始,或者当我单击按钮以清除他们绘制的突出显示矩形时。

因此,我从msdn示例中找到了一些很好的启动代码,用于创建一个放大橡皮筋矩形,我在下面编辑了一些代码,但我遇到了一些问题:

代码语言:javascript
复制
       Public bHaveMouse As Boolean
Public ptOriginal As Point
Public ptLast As Point
Public rect As Rectangle
Public b_Redraw As Boolean = False


' and Normalize the points and draw the reversible frame.
Private Sub MyDrawReversibleRectangle(ByVal p1 As Point, ByVal p2 As Point)
    Try
        'clear 

        ' Convert the points to screen coordinates.
        p1 = PointToScreen(p1)
        p2 = PointToScreen(p2)
        ' Normalize the rectangle.
        If (p1.X < p2.X) Then
            rect.X = p1.X
            rect.Width = p2.X - p1.X
        Else
            rect.X = p2.X
            rect.Width = p1.X - p2.X
        End If
        If (p1.Y < p2.Y) Then
            rect.Y = p1.Y
            rect.Height = p2.Y - p1.Y
        Else
            rect.Y = p2.Y
            rect.Height = p1.Y - p2.Y
        End If

        If rect.Width > pbZoneImage.Width Then
            rect.Width = pbZoneImage.Width
        End If

        If rect.Height > pbZoneImage.Height Then
            rect.Height = pbZoneImage.Height
        End If

        ' Draw the reversible frame.
        ControlPaint.DrawReversibleFrame(rect, Color.Red, FrameStyle.Thick)
    Catch ex As Exception

    End Try

End Sub

Private Sub pbZoneImage_MouseDown(sender As Object, e As MouseEventArgs) Handles pbZoneImage.MouseDown
    If e.Button <> Windows.Forms.MouseButtons.Left Then
        Exit Sub
    End If

    Try
        ' Make a note that we "have the mouse".
        bHaveMouse = True
        ' Store the "starting point" for this rubber-band rectangle.

        If b_Redraw Then
            If (ptLast.X <> -1) Then
                '     Dim ptCurrent As Point
                'ptCurrent.X = e.X
                'ptCurrent.Y = e.Y
                MyDrawReversibleRectangle(ptOriginal, ptLast)
            End If
            ' Set flags to know that there is no "previous" line to reverse.
            ptLast.X = -1
            ptLast.Y = -1
            ptOriginal.X = -1
            ptOriginal.Y = -1
        End If

        ptOriginal.X = e.X
        ptOriginal.Y = e.Y
        ' Special value lets us know that no previous
        ' rectangle needs to be erased.
        ptLast.X = -1
        ptLast.Y = -1
    Catch ex As Exception

    End Try

End Sub

Private Sub pbZoneImage_MouseMove(sender As Object, e As MouseEventArgs) Handles pbZoneImage.MouseMove
    Dim ptCurrent As Point
    ptCurrent.X = e.X
    ptCurrent.Y = e.Y
    ' If we "have the mouse", then we draw our lines.
    If (bHaveMouse) Then
        ' If we have drawn previously, draw again in
        ' that spot to remove the lines.
        If (ptLast.X <> -1) Then
            MyDrawReversibleRectangle(ptOriginal, ptLast)
        End If
        ' Update last point.
        ptLast = ptCurrent
        ' Draw new lines.
        MyDrawReversibleRectangle(ptOriginal, ptCurrent)
    End If
End Sub

Private Sub pbZoneImage_MouseUp(sender As Object, e As MouseEventArgs) Handles pbZoneImage.MouseUp

    'Try
    '    ' Set internal flag to know we no longer "have the mouse".
    bHaveMouse = False

End Sub

我的问题:有时在绘图时不会删除以前绘制的矩形,或者如果我悬停在某些按钮上(比如退出按钮),矩形就会消失!我希望他们留下,以便我可以记录开始和结束点的矩形为其他程序。当我点击清晰的矩形按钮时,我希望它们消失,但我觉得我在一些应该非常简单的事情上感到困惑。

另一个问题是,我试图防止矩形溢出外的图片框(Pbzoneimage)。但它确实改变了颜色。

我哪里出错了?有没有更好的方法来画这个呢?

EN

回答 1

Stack Overflow用户

发布于 2014-09-15 19:25:44

您需要两个位图,一个用于picturebox (img),另一个用于清除它并绘制矩形(ImgClone)。

代码语言:javascript
复制
Private mouse_Down As Point
Private img As Bitmap
Private imgClone As Bitmap

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    img = My.Resources..... 'or you can load the image from file

    PictureBox1.Image = img 'with this every time you invalidate it draws img to picturebox

    imgClone = CType(PictureBox1.Image.Clone, Bitmap)

End Sub

Private Sub PictureBox1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    mouse_Down = e.Location
End Sub

Private Sub PictureBox1_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    If e.Button = MouseButtons.Left And e.Location <> mouse_Down Then
        DrawRectangle(e.Location)
    End If
End Sub

Private Sub DrawRectangle(ByVal pnt As Point)
    Dim g As Graphics

    g = Graphics.FromImage(img)

    g.DrawImage(imgClone, 0, 0) 'we are clearing img with imgClone. imgClone contains the original image without the rectangles

    If pnt.X = mouse_Down.X Or pnt.Y = mouse_Down.Y Then
        g.DrawLine(Pens.Firebrick, mouse_Down.X, mouse_Down.Y, pnt.X, pnt.Y)

    Else
        g.DrawRectangle(Pens.Firebrick, Math.Min(mouse_Down.X, pnt.X), Math.Min(mouse_Down.Y, pnt.Y),
                    Math.Abs(mouse_Down.X - pnt.X), Math.Abs(mouse_Down.Y - pnt.Y))

    End If

    g.Dispose()

    PictureBox1.Invalidate() 'draw img to picturebox
End Sub

如果需要清除picturebox:

代码语言:javascript
复制
Dim g As Graphics

g = Graphics.FromImage(img)
g.DrawImage(imgClone, 0, 0)

g.Dispose()

PictureBox1.Invalidate()

瓦尔特

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25854754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档