שתף באמצעות


draw a rectangle on picture box and move it in mouse move event

Question

Tuesday, June 2, 2015 11:23 AM

hello everyone i want to make a rectangle inside a picture box and want to move it in mouse move event and also want to display its coordinates in a textbox like x and y but i am facing problems in doing that i did tried every thing 

i found a code in google but it just draws a rectangle in mouse move event in picturebox i cannot move that rectangle somebody please help me :(

so far here is the code 

Dim SelectionBoxObj As New Rectangulo()
    Dim IsMouseDown As Boolean = False
    Public SelectedObjPoint As Point

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
            IsMouseDown = True
            SelectedObjPoint = New Point(e.X, e.Y)
        End If
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
       If IsMouseDown = True Then
            If e.X < SelectionBoxObj.X Then
                SelectionBoxObj.X = e.X
                SelectionBoxObj.Width = SelectedObjPoint.X - e.X
            Else
                SelectionBoxObj.X = SelectedObjPoint.X
                SelectionBoxObj.Width = e.X - SelectedObjPoint.X

            End If
            If e.Y < SelectedObjPoint.Y Then
                SelectionBoxObj.Y = e.Y
                SelectionBoxObj.Height = SelectedObjPoint.Y - e.Y
            Else
                SelectionBoxObj.Y = SelectedObjPoint.Y
                SelectionBoxObj.Height = e.Y - SelectedObjPoint.Y
            End If

            Me.Refresh()
        End If
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        IsMouseDown = False
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        If SelectionBoxObj.Width > 0 And SelectionBoxObj.Height > 0 Then
            Dim oGradientBrush As Brush = New Drawing.Drawing2D.LinearGradientBrush(SelectionBoxObj.RectangleF, SelectionBoxObj.FillColor, SelectionBoxObj.FillColor, Drawing.Drawing2D.LinearGradientMode.Vertical)
            e.Graphics.FillRectangle(oGradientBrush, SelectionBoxObj.RectangleF)

            Dim TempPen = New Pen(SelectionBoxObj.BorderLineColor, SelectionBoxObj.BorderLineWidth)
            TempPen.DashStyle = SelectionBoxObj.BorderLineType
            e.Graphics.DrawRectangle(TempPen, SelectionBoxObj.RectangleF.X, SelectionBoxObj.RectangleF.Y, SelectionBoxObj.RectangleF.Width, SelectionBoxObj.RectangleF.Height)
        End If
    End Sub
    Public Class Rectangulo
        Private m_BorderLineColor As Color = Drawing.Color.FromArgb(255, 51, 153, 255)
        Private m_FillColor As Color = Drawing.Color.FromArgb(40, 51, 153, 255)
        Private m_BorderLineType As Drawing2D.DashStyle = Drawing2D.DashStyle.Solid
        Private m_BorderLineWidth As Integer = 1
        Private m_X As Single
        Private m_Y As Single
        Private m_Width As Single
        Private m_Height As Single
        Private m_RectangleF As RectangleF

        Public Property BorderLineWidth() As Integer
            Get
                Return m_BorderLineWidth
            End Get
            Set(ByVal value As Integer)
                m_BorderLineWidth = value
            End Set
        End Property
        Public Property BorderLineType() As Drawing2D.DashStyle
            Get
                Return m_BorderLineType
            End Get
            Set(ByVal value As Drawing2D.DashStyle)
                m_BorderLineType = value
            End Set
        End Property
        Public Property BorderLineColor() As Color
            Get
                Return m_BorderLineColor
            End Get
            Set(ByVal value As Color)
                m_BorderLineColor = value
            End Set
        End Property
        Public Property FillColor() As Color
            Get
                Return m_FillColor
            End Get
            Set(ByVal value As Color)
                m_FillColor = value
            End Set
        End Property
        Public Property X() As Single
            Get
                Return m_RectangleF.X
            End Get
            Set(ByVal value As Single)
                m_RectangleF.X = value
            End Set
        End Property
        Public Property Y() As Single
            Get
                Return m_RectangleF.Y
            End Get
            Set(ByVal value As Single)
                m_RectangleF.Y = value
            End Set
        End Property
        Public Property Width() As Single
            Get
                Return m_RectangleF.Width
            End Get
            Set(ByVal value As Single)
                m_RectangleF.Width = value
            End Set
        End Property
        Public Property Height() As Single
            Get
                Return m_RectangleF.Height
            End Get
            Set(ByVal value As Single)
                m_RectangleF.Height = value
            End Set
        End Property
        Public Property RectangleF() As RectangleF
            Get
                Return m_RectangleF
            End Get
            Set(ByVal value As RectangleF)
                m_RectangleF = value
            End Set
        End Property
    End Class

its not written by me i just found it on google :)

vinay pant

All replies (4)

Tuesday, June 2, 2015 2:04 PM ✅Answered

Is this homework?

Option Strict On
Public Class Form3
    Private MouseDownStage, MouseDownX, MouseDownY As Integer
    Private x1, y1, x2, y2 As Integer

    Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
        MouseDownStage = MouseOverRectangle(e.X, e.Y)
        MouseDownX = x1
        MouseDownY = y1
    End Sub
    Private Function MouseOverRectangle(x As Integer, y As Integer) As Integer
        'determine if the mouse pointer is over the handle or fence
        Dim h As Integer = 5
        Dim handleRect As New Rectangle(x2 - h, y2 - h, 2 * h, 2 * h)
        Dim fenceRect As New Rectangle(x1, y1, Math.Abs(x2 - x1), Math.Abs(y2 - y1))
        If handleRect.Contains(x, y) Then
            MouseOverRectangle = 2
        ElseIf fenceRect.Contains(x, y) Then
            MouseOverRectangle = 1
        Else
            MouseOverRectangle = 0
        End If

    End Function
    Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove

        If MouseDownStage > 0 Then
            If MouseDownStage = 1 Then
                'moving fence
                Dim dx, dy, w, h As Integer
                dx = e.X - MouseDownX
                dy = e.Y - MouseDownY
                w = Math.Abs(x2 - x1)
                h = Math.Abs(y2 - y1)

                x1 = MouseDownX + dx
                y1 = MouseDownY + dy
                x2 = x1 + w
                y2 = y1 + h
            Else
                'moving handle
                x2 = e.X
                y2 = e.Y
            End If
        Else
            Select Case MouseOverRectangle(e.X, e.Y)
                Case 1  'fence
                    Cursor.Current = Cursors.Hand
                Case 2 'handle
                    Cursor.Current = Cursors.SizeNESW
                Case Else
                    Cursor.Current = Cursors.Default
            End Select
        End If

        PictureBox1.Refresh()

    End Sub

    Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
        MouseDownStage = 0
    End Sub

    Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint

        With e.Graphics
            Using p As New Pen(Color.White, 3)
                p.DashStyle = Drawing2D.DashStyle.Dash
                .DrawRectangle(p, x1, y1, Math.Abs(x2 - x1), Math.Abs(y2 - y1))

                p.Width = 3
                p.Color = Color.LimeGreen
                p.DashStyle = Drawing2D.DashStyle.Solid

                Dim h As Integer = 5
                Dim rect As New Rectangle(x2 - h, y2 - h, 2 * h, 2 * h)
                .DrawRectangle(p, rect)

            End Using
        End With
    End Sub

    Private Sub Form3_Load(sender As Object, e As EventArgs) Handles Me.Load
        DoubleBuffered = True
        Me.BackColor = Color.Black

        x1 = 10
        y1 = 10
        x2 = 70
        y2 = 70
    End Sub
End Class

Tuesday, June 2, 2015 6:43 PM

hello everyone i want to make a rectangle inside a picture box and want to move it in mouse move event and also want to display its coordinates in a textbox like x and y but i am facing problems in doing that i did tried every thing 

i found a code in google but it just draws a rectangle in mouse move event in picturebox i cannot move that rectangle somebody please help me :(

so far here is the code 

Dim SelectionBoxObj As New Rectangulo()
    Dim IsMouseDown As Boolean = False
    Public SelectedObjPoint As Point

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
            IsMouseDown = True
            SelectedObjPoint = New Point(e.X, e.Y)
        End If
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
       If IsMouseDown = True Then
            If e.X < SelectionBoxObj.X Then
                SelectionBoxObj.X = e.X
                SelectionBoxObj.Width = SelectedObjPoint.X - e.X
            Else
                SelectionBoxObj.X = SelectedObjPoint.X
                SelectionBoxObj.Width = e.X - SelectedObjPoint.X

            End If
            If e.Y < SelectedObjPoint.Y Then
                SelectionBoxObj.Y = e.Y
                SelectionBoxObj.Height = SelectedObjPoint.Y - e.Y
            Else
                SelectionBoxObj.Y = SelectedObjPoint.Y
                SelectionBoxObj.Height = e.Y - SelectedObjPoint.Y
            End If

            Me.Refresh()
        End If
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        IsMouseDown = False
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        If SelectionBoxObj.Width > 0 And SelectionBoxObj.Height > 0 Then
            Dim oGradientBrush As Brush = New Drawing.Drawing2D.LinearGradientBrush(SelectionBoxObj.RectangleF, SelectionBoxObj.FillColor, SelectionBoxObj.FillColor, Drawing.Drawing2D.LinearGradientMode.Vertical)
            e.Graphics.FillRectangle(oGradientBrush, SelectionBoxObj.RectangleF)

            Dim TempPen = New Pen(SelectionBoxObj.BorderLineColor, SelectionBoxObj.BorderLineWidth)
            TempPen.DashStyle = SelectionBoxObj.BorderLineType
            e.Graphics.DrawRectangle(TempPen, SelectionBoxObj.RectangleF.X, SelectionBoxObj.RectangleF.Y, SelectionBoxObj.RectangleF.Width, SelectionBoxObj.RectangleF.Height)
        End If
    End Sub
    Public Class Rectangulo
        Private m_BorderLineColor As Color = Drawing.Color.FromArgb(255, 51, 153, 255)
        Private m_FillColor As Color = Drawing.Color.FromArgb(40, 51, 153, 255)
        Private m_BorderLineType As Drawing2D.DashStyle = Drawing2D.DashStyle.Solid
        Private m_BorderLineWidth As Integer = 1
        Private m_X As Single
        Private m_Y As Single
        Private m_Width As Single
        Private m_Height As Single
        Private m_RectangleF As RectangleF

        Public Property BorderLineWidth() As Integer
            Get
                Return m_BorderLineWidth
            End Get
            Set(ByVal value As Integer)
                m_BorderLineWidth = value
            End Set
        End Property
        Public Property BorderLineType() As Drawing2D.DashStyle
            Get
                Return m_BorderLineType
            End Get
            Set(ByVal value As Drawing2D.DashStyle)
                m_BorderLineType = value
            End Set
        End Property
        Public Property BorderLineColor() As Color
            Get
                Return m_BorderLineColor
            End Get
            Set(ByVal value As Color)
                m_BorderLineColor = value
            End Set
        End Property
        Public Property FillColor() As Color
            Get
                Return m_FillColor
            End Get
            Set(ByVal value As Color)
                m_FillColor = value
            End Set
        End Property
        Public Property X() As Single
            Get
                Return m_RectangleF.X
            End Get
            Set(ByVal value As Single)
                m_RectangleF.X = value
            End Set
        End Property
        Public Property Y() As Single
            Get
                Return m_RectangleF.Y
            End Get
            Set(ByVal value As Single)
                m_RectangleF.Y = value
            End Set
        End Property
        Public Property Width() As Single
            Get
                Return m_RectangleF.Width
            End Get
            Set(ByVal value As Single)
                m_RectangleF.Width = value
            End Set
        End Property
        Public Property Height() As Single
            Get
                Return m_RectangleF.Height
            End Get
            Set(ByVal value As Single)
                m_RectangleF.Height = value
            End Set
        End Property
        Public Property RectangleF() As RectangleF
            Get
                Return m_RectangleF
            End Get
            Set(ByVal value As RectangleF)
                m_RectangleF = value
            End Set
        End Property
    End Class

its not written by me i just found it on google :)

vinay pant

Please use the insert code block button  when providing code in a post as tommytwotrain

 did. Which makes the code simple to read and easy to follow unlike the code in your post.

La vida loca


Tuesday, June 2, 2015 6:55 PM

ok :)

and sorry for that 

vinay pant


Tuesday, June 2, 2015 6:56 PM | 1 vote

its not home work just my curiosity to learn :)

thanks a lot sir 

vinay pant