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"
.X = 0
.Y = 0
.Background = Color.Orange
End With
End
' Gestisce l'evento della pressione del tasto del mouse sulla DrawingArea
Public Sub DrawingArea1_MouseDown()
x = Mouse.X ' prende la coordinata x del punto ove si trova il mouse in quel momento
y = Mouse.Y ' prende la coordinata y del punto ove si trova il mouse in quel momento
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
.DrawText("abc", x, y) ' è il testo che andremo a spostare nella DrawingArea
.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 st As 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"
.X = 0
.Y = 0
.Background = Color.Orange
End With
End
Public Sub DrawingArea1_MouseDown()
st = 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()
Dim c As Short
For c = 0 To sstt.Max
With Paint
.Font.Size = 20
.DrawText(sstt[c].tx, sstt[c].xx, sstt[c].yy)
End With
Next
Paint.End
End
Il terzo codice, più complesso, consente di spostare il testo, dopo essere stato disegnato sulla "DrawingArea", mantenendo il 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" .X = 0 .Y = 0 .Background = Color.Orange 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 ideale, 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 .Font.Size = 20 .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 esempio ottiene il medesimo effetto del codice precedente: [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 un'immagine in una DrawingArea
[2] Il codice è stato realizzato dall'utente Gianluigi del forum www.gambas-it.org.