martedì 22 aprile 2014

Spostamento e ridimensionamento di un oggetto

Vediamo ora come creare un programma che permetta all'utente di variare dimensione e posizione di un oggetto a proprio piacimento. Creiamo un bottone ed una casella immagini, inizializzando le seguenti variabili:


Public Class Form1
    Dim B As New Bitmap(800, 6000)
    Dim G As Graphics = Graphics.FromImage(B)
    Public R As New Rectangle(10, 10, 200, 100)
    Public XInizialeMove As Integer
    Public YInizialeMove As Integer
    Public XInizialeRectangle As Integer
    Public YInizialeRectangle As Integer
    Public HInizialeRectangle As Integer
    Public WInizialeRectangle As Integer
    Public DeltaXMove As Integer
    Public DeltaYMove As Integer
    Public DragMove As Boolean
    Public DragResize As Boolean



Il rettangolo, le cui coordinate e le cui dimensioni sono state espresse nella fase precedente, viene visualizzato non appena si clicca sul bottone:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        G.Clear(Color.White)
        G.DrawRectangle(Pens.BlueViolet, R)
        PictureBox1.Image = B

    End Sub


Vogliamo a questo punto imporre che:
  • tenendo premuto sul tasto destro del mouse, e trascinando il cursore, sia possibile variare larghezza o altezza del rettangolo;
  • cliccando, invece, col sinistro, e sempre trascinando il cursore, si possa spostare l'intera figura, mantenendo inalterate le dimensioni.
La dichiarazione MouseDown permette di catturare la posizione del cursore, quando lo si sposta in basso o a destra:

Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
        If Not R.Contains(e.X, e.Y) Then Exit Sub
        If e.Button = Windows.Forms.MouseButtons.Left Then
            DragMove = True
        ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
            DragResize = True
        End If
        XInizialeMove = e.X
        YInizialeMove = e.Y
        XInizialeRectangle = R.X
        YInizialeRectangle = R.Y
        WInizialeRectangle = R.Width
        HInizialeRectangle = R.Height
    End Sub


Se non ci interessa abilitare le due funzioni quando si sposta il puntatore del mouse verso l'alto o a sinistra, entrambi le variabili booleane vengono impostate come false nella dichiarazione MouseUp:

   Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
        DragMove = False
        DragResize = False
    End Sub
End Class


MouseMove, invece, effettua istantaneamente il ridimensionamento o lo spostamento della figura, seguendo il movimento del cursore, lungo le posizioni registrate nella dichiarazione precedente:

Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        If Not DragMove AndAlso Not DragResize Then
            Exit Sub
        End If
        DeltaXMove = e.X - XInizialeMove
        DeltaYMove = e.Y - YInizialeMove
        If DragMove Then
            R = New Rectangle(XInizialeRectangle + DeltaXMove, YInizialeRectangle + DeltaYMove, R.Width, R.Height)
        ElseIf DragResize Then
            R = New Rectangle(XInizialeRectangle, YInizialeRectangle, WInizialeRectangle + DeltaXMove, HInizialeRectangle + DeltaYMove)
        End If
        G.Clear(Color.White)
        G.DrawRectangle(Pens.BlueViolet, R)
        PictureBox1.Image = B
    End Sub

Nessun commento:

Posta un commento