Spostare con il mouse un'immagine all'interno di una PictureBox

Da Gambas-it.org - Wikipedia.

Lo spostamento di un'immagine è operazione che in modo più corretto va adottata con una DrawingArea. [nota 1]

Ad ogni modo nella presente pagina cercheremo di ottenere l'effetto del movimento con il mouse di una immagine posta in una PictureBox.
Pertanto l'intento è quello di evitare di caricare l'immagine in una PictureBox, e di muovere tale Controllo grafico.

Bisogna considerare che la PictureBox è un area da disegno rigida, nel senso che non è possibile assegnare coordinate x e y, ove far apparire al suo interno l'immagine caricata.
L'unica possibilità in tal senso è quella di usare la Proprietà ".Arrangment", che però posiziona soltanto in coordinate fisse della PictureBox l'immagine caricata.

Per poter comunque ottenere l'effetto, in questa pagina desiderato, si procederà secondo questo trucco:
1) si posizionerà ovviamente una PictureBox sul Form (e sarà l'unica prevista nel codice, secondo le intenzione già preannunciate sopra);
2) poiché è possibile assegnare un'immagine all'interno di un'altra immagine, alle coordinate volute, si creerà un'immagine avente le medesime dimensioni e colore di sfondo della PictureBox;
3) tale Oggetto Image, pertanto, ospiterà la vera immagine, della quale a noi interessa mostrare lo spostamento nella PictureBox;
4) si disegnerà mediante il Metodo ".DrawinImage()", richiamato dall'Oggetto Image base, creato e descritto al precedente punto 2);
5) con l'Evento "_MouseMove()" della PictureBox si procederà allo spostamento dell'immagine, che ci interessa, all'interno di quella più grande ospitante.

Mostriamo un esempio pratico:

Private PictureBox1 AS PictureBox
Private im AS Image
Private im2 AS Image


Public SUB Form_Open()

  With Me
    .W = Screen.AvailableWidth * 0.5
    .H = Screen.AvailableHeight * 0.5
  End With

  With PictureBox1 = New PictureBox(Me) AS "PictureBox1"
    .W = Me.W
    .H = Me.h
    .Background = Color.SoftYellow
  End With
 
  im = New Image(PictureBox1.W, PictureBox1.H, PictureBox1.Background, Image.Standard)
  im2 = Image.Load("/usr/share/gambas3/control/gb.term.form/termradiobutton.png")
 
' Pone l'imagine al centro della sua immagine ospitante vuota, facendolo apparire al centro del "Form":
  im.DrawImage(im2, (ME.W * 0.5) - (im2.W / 2), (ME.H * 0.5) - (im2.W / 2), im2.W, im2.H)

  PictureBox1.Image = im

End


Public SUB PictureBox1_MouseUp()

  PictureBox1.Mouse = Mouse.Default 

End
Public SUB PictureBox1_MouseMove()

  PictureBox1.Mouse = 18

' Impedisce il movimento rapido dell'immagine lasciando tracce visibili del movimento precedente:
  im = im.Fill(PictureBox1.Background)

' Effettua lo spostamento dell'immagine all'interno dell'immagine ospitante:
  im.DrawImage(im2, Mouse.X - (im2.W * 0.5), Mouse.Y - (im2.H * 0.5), im2.W, im2.H)

  PictureBox1.Image = im

End


Note

[1] vedere al riguardo la seguente pagina: Spostare con il mouse un'immagine caricata in una DrawingArea