Ruotare un'immagine sul proprio asse centrale in una DrawingArea
Da Gambas-it.org - Wikipedia.
Versione del 26 mag 2023 alle 14:47 di Vuott (Discussione | contributi)
Nel caso in cui si debba far ruotare in una DrawingArea un'immagine sul proprio asse centrale, sia essa quadrata o rettangolare, si potrà adottare il seguente codice (cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine):
Private DrawingArea1 As DrawingArea Private im As Image Private fAngolo As Float Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" im = Image.Load("/percorso/della/immagine") End Public Sub DrawingArea1_MouseUp() ' Cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine While Object.IsValid(DrawingArea1) fAngolo += 10 DrawingArea1.Refresh Wait 0.1 wend End Public Sub DrawingArea1_Draw() With Paint ' Pone il centro di rotazione al centro della "DrawingArea". ' Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza. .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) ' Ponendo un valore negativo come parametro della funzione "Rad()", si otterrà la rotazione in senso orario: .Rotate(Rad(-fAngolo)) .DrawImage(im, -im.W / 2, -im.H / 2, im.W, im.H, 1.0, Null) .End End With End
Far ruotare un'immagine, avente sfondo trasparente, su un'altra immagine
In questo caso si riprenderà il codice sopra mostrato, aggiungendo nella Sub "DrawingArea1_Draw()" semplicemente la riga necessaria per mostrare l'immagine di base che resterà ferma:
Private DrawingArea1 As DrawingArea Private qd As Image Private im As Image Private fAngolo As Float Public Sub Form_Open() With Me .W = Screen.AvailableWidth * 0.33 .H = Screen.AvailableHeight * 0.33 .Arrangement = Arrange.Fill End With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" qd = Image.Load("/usr/share/icons/breeze-dark/devices/64/media-optical-blu-ray.svg") im = Image.Load("/usr/share/icons/breeze-dark/apps/32/system-help.svg") End Public Sub Form_MouseWheel() ' Ruotando la rotellina del mouse, si produrrà la rotazione dell'immagine superiore fAngolo += Mouse.Delta DrawingArea1.Refresh End Public Sub DrawingArea1_Draw() With Paint ' Disegna l'immagine inferiore che resterà ferma: .DrawImage(qd, (DrawingArea1.W / 2) - (qd.W * 0.5), (DrawingArea1.H / 2) - (qd.H * 0.5), qd.W, qd.H, 1.0, Null) ' Pone il centro di rotazione al centro della "DrawingArea". ' Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza. .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) .Rotate(Rad(fangolo + 7)) .DrawImage(im, -im.W / 2, -im.H / 2, im.W, im.H, 1.0, Null) .End End With End