Differenze tra le versioni di "Ruotare un'immagine sul proprio asse centrale in una DrawingArea"
Da Gambas-it.org - Wikipedia.
Riga 2: | Riga 2: | ||
Private DrawingArea1 As DrawingArea | Private DrawingArea1 As DrawingArea | ||
Private im As Image | Private im As Image | ||
− | Private | + | Private fAngolo As Float |
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
Riga 20: | Riga 20: | ||
While Object.IsValid(DrawingArea1) | While Object.IsValid(DrawingArea1) | ||
− | + | fAngolo += 10 | |
DrawingArea1.Refresh | DrawingArea1.Refresh | ||
Wait 0.1 | Wait 0.1 | ||
Riga 33: | Riga 33: | ||
' ''Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.''</font> | ' ''Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.''</font> | ||
.Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) | .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) | ||
− | .Rotate(Rad( | + | .Rotate(Rad(fAngolo)) |
.DrawImage(im, <FONT Color=#B22222>-im.W / 2</font>, <FONT Color=#B22222>-im.H / 2</font>, im.W, im.H, 1.0, Null) | .DrawImage(im, <FONT Color=#B22222>-im.W / 2</font>, <FONT Color=#B22222>-im.H / 2</font>, 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() <FONT Color=gray>' ''Ruotando la rotellina del mouse, si produrrà la rotazione dell'immagine superiore''</font> | ||
+ | |||
+ | fAngolo += Mouse.Delta | ||
+ | |||
+ | DrawingArea1.Refresh | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | '''Public''' Sub DrawingArea1_Draw() | ||
+ | |||
+ | With Paint | ||
+ | <FONT Color=gray>' ''Disegna l'immagine inferiore che resterà ferma:''</font> | ||
+ | .DrawImage(qd, (DrawingArea1.W / 2) - (qd.W * 0.5), (DrawingArea1.H / 2) - (qd.H * 0.5), qd.W, qd.H, 1.0, Null) | ||
+ | <FONT Color=gray>' ''Pone il centro di rotazione al centro della "DrawingArea".'' | ||
+ | ' ''Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.''</font> | ||
+ | .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 | ||
End With | End With | ||
'''End''' | '''End''' |
Versione delle 15:44, 26 mag 2023
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) .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