Spostare con il mouse il testo in una DrawingArea
Mostreremo alcuni codici per spostare con il mouse un testo all'interno di una DrawingArea.
Il primo codice più semplice e basilare per effettuare uno spostamento del testo nella DrawingArea dopo averlo disegnato: cliccare con il mouse sulla "DrawingArea", per disegnare il testo e, mantenendo cliccato, spostare il mouse sulla superficie.
Private DrawingArea1 As DrawingArea Private x As Integer Private y As Integer Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Background = Color.Orange End With End ' Gestisce l'Evento della pressione del tasto del mouse sulla DrawingArea Public Sub DrawingArea1_MouseDown() ' Prende le coordinata x e y del punto ove si trova il mouse in quel momento: x = Mouse.X y = Mouse.Y ' Attiva l'Evento "_Draw()" della "DrawingArea": DrawingArea1.Refresh End ' Gestisce l'Evento dello spostamento del mouse sulla "DrawingArea". Public Sub DrawingArea1_MouseMove() x = Mouse.X y = Mouse.Y DrawingArea1.Mouse = 18 DrawingArea1.Refresh End Public Sub DrawingArea1_MouseUp() DrawingArea1.Mouse = Mouse.Default End Public Sub DrawingArea1_Draw() With Paint .Font.Size = 20 ' Disegna il testo, che sarà poi spostato, nella DrawingArea: .DrawText("abc", x, y) .End End With End
Il secondo codice consente di aggiungere più stringhe testuali alla DrawingArea. Tali stringhe, mantenendo cliccato con il mouse subito dopo averle create, possono essere spostate sulla superficie della "DrawingArea":
Public Struct STRUTTURA xx As Integer yy As Integer tx As String End Struct Private sstt As New STRUTTURA[] Private DrawingArea1 As DrawingArea Private i As Integer Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Background = Color.Orange .Font.Size = 20 End With End Public Sub DrawingArea1_MouseDown() Dim st As STRUTTURA = New STRUTTURA sstt.Push(st) sstt[sstt.Max].xx = Mouse.X sstt[sstt.Max].yy = Mouse.Y Inc i sstt[sstt.Max].tx = "abc " & CStr(i) DrawingArea1.Refresh End Public Sub DrawingArea1_MouseMove() sstt[sstt.Max].xx = Mouse.X sstt[sstt.Max].yy = Mouse.Y DrawingArea1.Mouse = 18 DrawingArea1.Refresh End Public Sub DrawingArea1_MouseUp() DrawingArea1.Mouse = Mouse.Default End Public Sub DrawingArea1_Draw() With Paint For c As Short = 0 To xx.Max .DrawText("abc" & CStr(ii[c]), xx[c], yy[c]) Next .End End With End
Il precedente codice può essere ovviamente scritto utilizzando vettori di tipi di dati nativi anziché di tipo Struttura.
Private DrawingArea1 As DrawingArea Private xx As New Integer[] Private yy As New Integer[] Private ii As New String[] Private i As Integer Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Background = Color.Orange .Font.Size = 20 End With End Public Sub DrawingArea1_MouseDown() xx.Push(Mouse.X) yy.Push(Mouse.Y) Inc i ii.Push(i) DrawingArea1.Refresh End Public Sub DrawingArea1_MouseMove() xx[xx.Max] = Mouse.X yy[yy.Max] = Mouse.Y DrawingArea1.Refresh End Public Sub DrawingArea1_Draw() With Paint For c As Short = 0 To xx.Max .DrawText("abc" & CStr(ii[c]), xx[c], yy[c]) Next .End End With End
Il terzo codice, più complesso, consente di spostare il testo sulla "DrawingArea", conservando la posizione del puntatore del mouse premuto nel punto dell'immagine, ove si è cliccato. [nota 1]
Private DrawingArea1 As DrawingArea Private Const TESTO As String = "Abcde" Private rc As Rect Private x As Short Private y As Short Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Background = Color.Orange .Font.Size = 20 End With End Public Sub Form_Arrange() Dim w, h As Short w = DrawingArea1.Font.TextSize(TESTO).W h = DrawingArea1.Font.TextSize(TESTO).H ' Imposta un quadrilatero rettangolo immaginario, adattato alle dimensioni del testo, che sarà usato per consentire di spostare il testo solo se si è cliccato al suo interno: rc = New Rect((DrawingArea1.W / 2) - (w / 2), (DrawingArea1.H / 2) - (h / 2), w, h) End Public Sub DrawingArea1_Draw() With Paint .DrawText(TESTO, rc.X, rc.Y, rc.W, rc.H, Align.Normal) .End End With End Public Sub DrawingArea1_MouseDown() With rc If Not .Contains(Mouse.X, Mouse.Y) Then Return x = Mouse.X - .X y = Mouse.Y - .Y End With End Public Sub DrawingArea1_MouseMove() With rc If Not .Contains(Mouse.X, Mouse.Y) Then Return .X = Mouse.X - x .Y = Mouse.Y - y End With With DrawingArea1 .Mouse = 18 .Refresh End With End Public Sub DrawingArea1_MouseUp() DrawingArea1.Mouse = Mouse.Default End
Il seguente quarto codice non fa uso della Classe "Rect" e anch'esso, tenendo conto del rettangolo immaginario formato dalle dimensioni del testo, consentirà lo spostamento del testo, solo se si cliccherà all'interno di tale rettangolo: [nota 1]
Private DrawingArea1 As DrawingArea Private x As Short Private y As Short Private w As Short Private h As Short Private difx As Short Private dify As Short Private Const TESTO As String = "Abcde" Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Background = Color.Orange End With End Public Sub Form_Arrange() With DrawingArea1.Font .Size = 20 w = .TextSize(TESTO).W h = .TextSize(TESTO).H End With x = (DrawingArea1.W / 2) - (w / 2) y = (DrawingArea1.H / 2) - (h / 2) End Public Sub DrawingArea1_MouseDown() difx = -1 ' Verifica se è stato cliccato all'interno del rettangolo immaginario formato dalle dimensioni del testo: If (Mouse.X < x) Or (Mouse.X > (x + w)) Or (Mouse.Y < y) Or (Mouse.Y > (y + h)) Then Return ' oppure: If (x \ Mouse.X) + (Mouse.X \ (x + w)) + (y \ Mouse.Y) + (Mouse.Y \ (y + h)) > 0 Then Return difx = x - Mouse.X dify = y - Mouse.Y End Public Sub DrawingArea1_MouseMove() If difx == -1 Then Return x = Mouse.X + difx y = Mouse.Y + dify With DrawingArea1 .Mouse = 18 .Refresh End With End Public Sub DrawingArea1_MouseUp() DrawingArea1.Mouse = Mouse.Default End Public Sub DrawingArea1_Draw() With Paint .DrawText(TESTO, x, y, w, h, Align.Normal) .End End With End
Il seguente codice, molto simile al precedente, fa uso del sub-Metodo ".Contains()" fornito da alcune Classi che dispongono della Proprietà ".Font".
Private DrawingArea1 As DrawingArea Private Const TESTO As String = "Abcde" Private x As Short Private y As Short Private psx As Short Private psy As Short Private mx As Short Private my As Short Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Background = Color.Orange .Font.Size = 20 End With End Public Sub Form_Arrange() With DrawingArea1 x = (.W / 2) - (.Font.TextSize(TESTO).W / 2) y = (.H / 2) - (.Font.TextSize(TESTO).H / 2) End With psx = x psy = y End Public Sub DrawingArea1_Draw() With Paint .DrawText(TESTO, x, y, .Font.TextSize(TESTO).W, .Font.TextSize(TESTO).H, Align.Normal) .End End With End Public Sub DrawingArea1_MouseDown() mx = -1 ' Verifica se è stato cliccato all'interno del rettangolo immaginario compreso dal testo impostato: If Not DrawingArea1.Font.TextSize(TESTO).Contains(Mouse.X - psx, Mouse.Y - psy) Then Return mx = Mouse.X my = Mouse.Y End Public Sub DrawingArea1_MouseMove() With DrawingArea1 ' Verifica se è stato cliccato all'interno del rettangolo immaginario compreso dal testo impostato: If mx == -1 Then Return x = psx - (mx - Mouse.X) y = psy - (my - Mouse.Y) .Mouse = 18 .Refresh End With End Public Sub DrawingArea1_MouseUp() DrawingArea1.Mouse = Mouse.Default psx = x psy = y End
Il seguente quinto codice ottiene il medesimo effetto dei codici precedenti: [Nota 2]
Private bOk As Boolean ' Booleano attivo se puntatore è in area scritta Private bDis As Boolean ' Booleano attivo se dati provengono da Form_Open Private xIn As Integer ' Memorizza la posizione del testo al momento che agiamo sul tasto sinistro del mouse Private yIn As Integer ' Idem Private xDif As Integer ' Memorizza la distanza tra la posizione del puntatore e quella del testo Private yDif As Integer ' Idem Private x As Integer ' Memorizza la posizione del puntatore Private y As Integer ' Idem Private iAlt As Integer ' Memorizza l'altezza del testo Private iLarg As Integer ' Memorizza la larghezza del testo Private sTesto As String ' Memorizza la scritta del testo Public Sub Form_Open() ' Inserisce il testo al centro dell'area di disegno dando le giuste indicazioni a DrawingArea1_Draw: sTesto = "Testo di prova" bDis = True bOk = True End Public Sub DrawingArea1_MouseDown() ' Quando si preme il tasto sinistro passa la posizione del mouse alle variabili x e y: x = Mouse.X y = Mouse.Y ' Ottiene la differenza fra le posizioni x e y del testo rispetto a quelle del mouse: xDif = xIn - x yDif = yIn - y ' Si accerta che il booleano OK sia su false: bOk = False ' Se il mouse si trova nell'area della scritta cambia aspetto e porta il booleano OK a vero: If x >= xIn And x <= (xIn + iLarg) Then If y <= yIn And y >= (yIn - iAlt) Then DrawingArea1.Mouse = Mouse.SizeAll bOk = True Endif Endif End Public Sub DrawingArea1_MouseMove() ' Se il booleano OK è vero passa alle variabili la posizione e attiva il disegno: If bOk Then x = Mouse.X y = Mouse.Y DrawingArea1.Refresh Endif End Public Sub DrawingArea1_Draw() ' Se il booleano "bOK" è vero, passa a controllare il booleano eventualmente attivato da "Form_Open". ' Se quest'ultimo è vero crea il testo scritto al centro dell'area di disegno, altrimenti disegna il testo sulle indicazioni del mouse: If bOk Then With Paint .Font.Size = ridimensiona(22) If bDis Then iLarg = .Font.RichTextWidth(sTesto) x = (DrawingArea1.W / 2) - (iLarg / 2) xIn = x iAlt = .Font.RichTextHeight(sTesto) y = (DrawingArea1.H / 2) + (iAlt / 2) yIn = y bDis = False Endif .DrawText(sTesto, x + xDif, y + yDif) .End End With Endif End Public Sub DrawingArea1_MouseUp() ' Quando si rilascia il bottone del mouse cambia l'aspetto del mouse a quello di default e memorizza nelle variabili la posizione iniziale della scritta per essere pronti al nuovo trascinamento: DrawingArea1.Mouse = Mouse.Default xIn = x + xDif yIn = y + yDif End Public Sub ridimensiona(size As Float) As Float ' Proporziona il testo nell'area di disegno: If Paint.Device = DrawingArea1 Then Return (size * 0.744) Else Return size Endif End
Note
[1] Vedere anche:
- Spostare con il mouse un rettangolo in una DrawingArea
- Spostare con il mouse senza Drag&Drop un'immagine caricata in una DrawingArea
- Creare, spostare e distruggere un'immagine in una DrawingArea
[2] Il codice è stato realizzato dall'utente Gianluigi del forum www.gambas-it.org.