Costruzione di un oggetto interattivo draggabile e ridimensionabile atto a contenere un grafico


Gli eventi, cioè le azioni che vengono scatenate dall’utente o generate da particolari condizioni, sono un punto chiave della programmazione con Visual Studio.
Alcuni importanti eventi sono quelli generabili con il mouse, si possono definire infatti le azioni che seguono al movimento del mouse, al click del tasto sinistro, del destro e della rotella.
In questo esempio creiamo un rettangolo che, tramite le funioni MouseUp, MouseDown, MouseMove e MouseWheel, subisce delle modifiche come lo spostamento e il ridimensionamento.

Public Class RettangoloAnimato

    Public Event RettangoloModificato()

    Public WithEvents PictureBox1 As PictureBox
    Public b As Bitmap
    Public R As Rectangle

    Public g As Graphics
    Public Penna As Pen


    'Dragging
    Public VerticeRettangolo_MouseDown As Point
    Public Posizione_MouseDown As Point
    Public DraggingInCorso As Boolean

    'Resize
    Public SizeRettangolo_MouseDown As Point
    Public Posizione_MouseDown_R As Point
    Public ResizingInCorso As Boolean

    Sub New(b As Bitmap, PictureBox1 As PictureBox, R As Rectangle, g As Graphics, Penna As Pen)

        Me.b = b
        Me.PictureBox1 = PictureBox1
        Me.R = R

        Me.g = g
        Me.Penna = Penna

    End Sub


    Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown

        If Not Me.R.Contains(e.Location) Then Exit Sub

        If e.Button = Windows.Forms.MouseButtons.

Left Then
            Me.Posizione_MouseDown = e.Location
            Me.VerticeRettangolo_MouseDown = R.Location
            Me.DraggingInCorso = True

        ElseIf e.Button = Windows.Forms.MouseButtons.
Right Then
            Me.Posizione_MouseDown_R = e.Location
            Me.SizeRettangolo_MouseDown = R.Size
            Me.ResizingInCorso = True
        End If

    End Sub

    Private Sub PictureBox1_MouseEnter(sender As Object, e As EventArgs) Handles PictureBox1.MouseEnter

    End Sub

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

        If Me.DraggingInCorso Then
            Dim DeltaX As Integer = e.X - Me.Posizione_MouseDown.X
            Dim DeltaY As Integer = e.Y - Me.Posizione_MouseDown.Y
            R.Location = New Point(Me.VerticeRettangolo_
MouseDown.X + DeltaX, Me.VerticeRettangolo_MouseDown.Y + DeltaY)

            'correzione bordo laterale
            If R.X < 0 Then R.X = 0
            If R.X > b.Width - R.Width Then R.X = b.Width - R.Width

            If R.Y < 0 Then R.Y = 0
            If R.Y > b.Height - R.Height Then R.Y = b.Height - R.Height


        End If

        If Me.ResizingInCorso Then
            Dim DeltaX As Integer = e.X - Me.Posizione_MouseDown_R.X
            Dim DeltaY As Integer = e.Y - Me.Posizione_MouseDown_R.Y
            R.Size = New Size(Math.Max(50, Me.SizeRettangolo_MouseDown.X + DeltaX), Math.Max(50, Me.SizeRettangolo_MouseDown.Y + DeltaY))
        End If

        RaiseEvent RettangoloModificato()

        'Me.Ridisegno()

    End Sub

    Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
        Me.DraggingInCorso = False
        Me.ResizingInCorso = False
    End Sub


    Sub DisegnoCornice()
        g.DrawRectangle(Penna, Me.R)
    End Sub


    Public SommaRotazioni


    Public FattoreIngrandimento As Double = 1.1
    Public FattoreRiduzione As Double = 0.9


    Private Sub PictureBox1_MouseWheel(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseWheel


        'Dim ROtazione As Integer = e.Delta

        'Form1.RichTextBox1.
AppendText(Environment.NewLine & ROtazione)

        'SommaRotazioni += e.Delta / 120
        'Form1.RichTextBox1.
AppendText(Environment.NewLine & SommaRotazioni)

        'modifica rettangolo
        'R.Size = New Size(Me.R.Width + SommaRotazioni, Me.R.Height + SommaRotazioni)

        Dim FattoreScalingUsato As Double

        If e.Delta > 0 Then
            FattoreScalingUsato = FattoreIngrandimento
        ElseIf e.Delta < 0 Then
            FattoreScalingUsato = FattoreRiduzione
        End If

        Dim NUovaLArghezza As Double = (Me.R.Width * FattoreScalingUsato)
        Dim NUovaAltezza As Double = (Me.R.Height * FattoreScalingUsato)

        Dim SemiDifferenzaNUovaVecchiaLarg
hezza As Double = (NUovaLArghezza - Me.R.Width) / 2
        Dim SemiDifferenzaNUovaVecchiaAlte
zza As Double = (NUovaAltezza - Me.R.Height) / 2

        R.Location = New Point(Me.R.X - SemiDifferenzaNUovaVecchiaLarg
hezza, Me.R.Y - SemiDifferenzaNUovaVecchiaAltezza)
        R.Size = New Size(Me.R.Width + 2 * SemiDifferenzaNUovaVecchiaLarg
hezza, Me.R.Height + 2 * SemiDifferenzaNUovaVecchiaAltezza)

        RaiseEvent RettangoloModificato()


    End Sub


End Class

Commenti