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