Modificare la dimensione di un Oggetto grafico con il mouse impostando i punti di contatto intorno al suo perimetro

Da Gambas-it.org - Wikipedia.

Per ridimensionare un Controllo con il mouse, è sufficiente con opportuno codice operare in movimento con il puntatore del mouse sull'Oggetto grafico medesimo. [nota 1]

In questa pagina mostreremo un codice, per disegnare lungo il perimetro di un Controllo gli otto consueti punti quadrati di contatto, e per operare il ridimensionamento del predetto Controllo agendo con il puntatore del mouse su tali punti di contatto.
Nell'esempio di codice seguente si opererà, come Oggetto grafico, su di un Panel.

Private Panel1 As Panel
Private id As New Integer[]
Private rrtt As New Panel[]
Private y As Short
Private x As Short


Public Sub Form_Open()

 Dim rtn As Panel

 With Panel1 = New Panel(Me) As "Panel1"
   .W = Me.W * 0.2
   .H = Me.H * 0.1
   .X = (Me.W * 0.5) - (Panel1.W * 0.5)
   .Y = (Me.H * 0.5) - (Panel1.H * 0.5)
   .Border = Border.Plain
 End With

 For b As Byte = 0 To 2
   For n As Byte = 0 To 2
     If (b And n) == 1 Then Continue
     With rtn = New Panel(Me) As "Rectangulum"
       .X = (Panel1.X + ((Panel1.W * 0.5) * n)) - 3
       .Y = (Panel1.Y + ((Panel1.H * 0.5) * b)) - 3
       .W = 7
       .H = 7
       .Background = Color.SoftBlue
       id.Push(.Id)
     End With
     rrtt.Push(rtn)
   Next
 Next

End


Public Sub Rectangulum_MouseDown()
  
 Y = Panel1.Y
 x = Panel1.x
 
End


Public Sub Rectangulum_MouseMove()

 With Last
   .X = .X + Mouse.X - Mouse.StartX + 3
   .Y = .Y + Mouse.Y - Mouse.StartY + 3
 End With

 Select Case Last.Id
   Case id[0]
     With Panel1
       .X = Last.X
       .W = (x + .W) - Last.X
       x = .X
       .Y = Last.Y
       .H = (y + .H) - Last.Y
       y = .Y
     End With
     Last.Y -= 3
     Last.X -= 3
     With rrtt[1]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
       .Y = Panel1.Y - 3
     End With
     With rrtt[2]
       .Y = Panel1.Y - 3
     End With
     With rrtt[3]
       .X = Panel1.X - 3
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[4]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[5]
       .X = Panel1.X - 3
     End With
     With rrtt[6]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
   Case id[1]
     With Panel1
       .Y = Last.Y
       .H = (y + .H) - Last.Y
       y = .Y
     End With
     Last.Y -= 3
     Last.X = Panel1.X + (Panel1.W * 0.5) - 3
     With rrtt[0]
       .Y = Panel1.Y - 3
     End With
     With rrtt[2]
       .Y = Panel1.Y - 3
     End With
     With rrtt[3]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[4]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
   Case id[2]
     With Panel1
       .W = Last.X - x
       x = .X
       .Y = Last.Y
       .H = (y + .H) - Last.Y
       y = .Y
     End With
     Last.X -= 3
     Last.Y -= 3
     With rrtt[0]
       .Y = Panel1.Y - 3
     End With
     With rrtt[1]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
       .Y = Panel1.Y - 3
     End With
     With rrtt[3]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[4]
       .X = Panel1.X + Panel1.W - 3
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[6]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
     With rrtt[7]
       .X = Panel1.X + Panel1.W - 3
     End With
   Case id[3]
     With Panel1
       .X = Last.X
       .W = (x + .W) - Last.X
       x = .X
     End With
     Last.Y = Panel1.Y + (Panel1.H * 0.5) - 3
     Last.X = Panel1.X - 3
     With rrtt[0]
       .X = Panel1.X - 3
     End With
     With rrtt[1]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
     With rrtt[5]
       .X = Panel1.X - 3
     End With
     With rrtt[6]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
   Case id[4]
     With Panel1
       .W = Last.X - x
       x = .X
     End With
     Last.X -= 4
     Last.Y = Panel1.Y + (Panel1.H * 0.5) - 3
     With rrtt[1]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
     With rrtt[2]
       .X = Panel1.X + Panel1.W - 3
     End With
     With rrtt[6]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
     With rrtt[7]
       .X = Panel1.X + Panel1.W - 3
     End With
   Case id[5]
     With Panel1
       .X = Last.X
       .W = (x + .W) - Last.X
       x = .X
       .H = Last.Y - y
       y = .Y
     End With
     Last.X -= 3
     Last.Y = Panel1.Y + Panel1.H - 3
     With rrtt[0]
       .X = Panel1.X - 3
     End With
     With rrtt[1]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
     With rrtt[3]
       .X = Panel1.X - 3
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[4]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[6]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
       .Y = Panel1.Y + Panel1.H - 3
     End With
     With rrtt[7]
       .Y = Panel1.Y + Panel1.H - 3
     End With
   Case id[6]
     With Panel1
       .H = Last.Y - y
       y = .Y
     End With
     Last.Y -= 3
     Last.X = Panel1.X + (Panel1.W * 0.5) - 3
     With rrtt[3]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[4]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[5]
       .Y = Panel1.Y + Panel1.H - 3
     End With
     With rrtt[7]
       .Y = Panel1.Y + Panel1.H - 3
     End With
   Case id[7]
     With Panel1
       .W = Last.X - x
       x = .X
       .H = Last.Y - y
       y = .Y
     End With
     Last.X = Panel1.X + Panel1.W - 4
     Last.Y = Panel1.Y + Panel1.H - 4
     With rrtt[1]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
     End With
     With rrtt[2]
       .X = Panel1.X + Panel1.W - 3
     End With
     With rrtt[3]
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[4]
       .X = Panel1.X + Panel1.W - 3
       .Y = Panel1.Y + (Panel1.H * 0.5) - 3
     End With
     With rrtt[5]
       .Y = Panel1.Y + Panel1.H - 3
     End With
     With rrtt[6]
       .X = Panel1.X + (Panel1.W * 0.5) - 3
       .Y = Panel1.Y + Panel1.H - 3
     End With
 End Select

End


Note

[1] Al riguardo si vedano le seguenti pagine: