Differenze tra le versioni di "Disegnare un misuratore analogico su una DrawingArea"
Da Gambas-it.org - Wikipedia.
(6 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Mostriamo | + | Mostriamo qualche codice per disegnare su una ''DrawingArea'' un possibile misuratore analogico virtuale da poter usare. |
+ | |||
+ | |||
+ | <B>1° esempio</b> | ||
Private Const VALORI As Short = 100 <FONT Color=gray>' ''L'ambito dei valori (da 0 sino al massimo qui espresso)''</font> | Private Const VALORI As Short = 100 <FONT Color=gray>' ''L'ambito dei valori (da 0 sino al massimo qui espresso)''</font> | ||
Private ARCO As Short = VALORI * 2 <FONT Color=gray>' ''L'arco entro il quale si stenderanno graficamente i valori (da 0 sino a VALORI)''</font> | Private ARCO As Short = VALORI * 2 <FONT Color=gray>' ''L'arco entro il quale si stenderanno graficamente i valori (da 0 sino a VALORI)''</font> | ||
Riga 14: | Riga 17: | ||
− | + | Public Sub Form_Open() | |
+ | With Me | ||
+ | .W = Screen.AvailableWidth | ||
+ | .H = Screen.AvailableHeight | ||
+ | .Arrangement = Arrange.Fill | ||
+ | End With | ||
With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" | With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" | ||
− | . | + | .Background = Color.SoftYellow |
− | |||
− | |||
− | |||
End With | End With | ||
− | + | ||
− | + | End | |
− | + | Public Sub DrawingArea1_MouseMove() | |
n = (((DrawingArea1.H / 2) - (Mouse.Y - 45)) / (DrawingArea1.H / 3)) * ARCO | n = (((DrawingArea1.H / 2) - (Mouse.Y - 45)) / (DrawingArea1.H / 3)) * ARCO | ||
Riga 35: | Riga 40: | ||
DrawingArea1.Refresh | DrawingArea1.Refresh | ||
− | + | End | |
+ | |||
+ | Public Sub DrawingArea1_Draw() | ||
− | |||
− | |||
Dim x, y, t As Short | Dim x, y, t As Short | ||
Dim c, r2 As Float | Dim c, r2 As Float | ||
Riga 87: | Riga 92: | ||
End With | End With | ||
− | '''End''' | + | End |
+ | Per far ruotare la lancetta indicatrice, cliccare all'altezza dello zero del quadrante e, mantenendo premuto il tasto sinistro del mouse, spostarsi in verticale. | ||
+ | |||
+ | |||
+ | <B>2° esempio</b> | ||
+ | <BR>Quest'altro esempio, molto essenziale, modificato su un codice iniziale creato dal membro ''cogier'' del forum https://forum.gambas.one/index.php. | ||
+ | Private DrawingArea1 As DrawingArea | ||
+ | Private Slider1 As Slider | ||
+ | |||
+ | |||
+ | Public Sub Form_Open() | ||
+ | |||
+ | With Me | ||
+ | .Height = 300 | ||
+ | .Width = 300 | ||
+ | .Padding = 5 | ||
+ | .Arrangement = Arrange.Vertical | ||
+ | .Center | ||
+ | End With | ||
+ | |||
+ | With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" | ||
+ | .Expand = True | ||
+ | End With | ||
+ | |||
+ | With Slider1 = New Slider(Me) As "Slider1" | ||
+ | .Height = 20 | ||
+ | .MaxValue = 360 | ||
+ | End With | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Slider1_Change() | ||
+ | |||
+ | DrawingArea1.Refresh | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub DrawingArea1_Draw() | ||
+ | |||
+ | Dim cx As Integer = DrawingArea1.W / 2 <FONT Color=gray>' ''Centro orizzontale''</font> | ||
+ | Dim cy As Integer = DrawingArea1.H / 2 <FONT Color=gray>' ''Centro verticale''</font> | ||
+ | |||
+ | With Paint | ||
+ | .Translate(cx, cy) | ||
+ | .Rotate(-Slider1.value / ((360 * 100) / 630)) | ||
+ | .Translate(-cx, -cy) | ||
+ | .Brush = Paint.Color(Color.Red) | ||
+ | .MoveTo(CX, CY - 80) | ||
+ | .LineTo(cx + 10, cy) | ||
+ | .LineTo(cx, cy + 20) | ||
+ | .LineTo(cx - 10, cy) | ||
+ | .LineTo(cx, cy - 80) | ||
+ | .Fill | ||
+ | |||
+ | .Brush = Paint.Color(Color.Black) | ||
+ | .MoveTo(CX, CY - 80) | ||
+ | .LineTo(cx + 10, cy) | ||
+ | .LineTo(cx, cy + 20) | ||
+ | .LineTo(cx - 10, cy) | ||
+ | .LineTo(cx, cy - 80) | ||
+ | .lineto(cx, cy + 20) | ||
+ | .Stroke | ||
+ | .End | ||
+ | End With | ||
+ | |||
+ | End |
Versione attuale delle 10:56, 27 giu 2024
Mostriamo qualche codice per disegnare su una DrawingArea un possibile misuratore analogico virtuale da poter usare.
1° esempio
Private Const VALORI As Short = 100 ' L'ambito dei valori (da 0 sino al massimo qui espresso) Private ARCO As Short = VALORI * 2 ' L'arco entro il quale si stenderanno graficamente i valori (da 0 sino a VALORI) Private Const INIZIALE As Short = 170 ' Il punto (in gradi) di inizio dell'arco dei valori mostrati Private Const PASSO As Byte = 20 ' Il passo dei valori effettivamente mostrati lungo l'arco Private Const RAGGIO As Short = 100 Private Const AUM_RAGG As Single = 2.3 Private INARC075 As Single = INIZIALE + (ARCO * 0.75) Private ii As Integer[] = [Color.Green, INIZIALE, ARCO * 0.75, Color.Yellow, INARC075, ARCO * 0.15, Color.Red, INARC075 + (ARCO * 0.15), ARCO * 0.1] Private n As Single Private DrawingArea1 As DrawingArea 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.SoftYellow End With End Public Sub DrawingArea1_MouseMove() n = (((DrawingArea1.H / 2) - (Mouse.Y - 45)) / (DrawingArea1.H / 3)) * ARCO If n < 0 Then n = 0 If n > ARCO Then n = ARCO DrawingArea1.Refresh End Public Sub DrawingArea1_Draw() Dim x, y, t As Short Dim c, r2 As Float Dim b As Byte x = DrawingArea1.W * 0.5 y = DrawingArea1.H * 0.5 ' Quando "n" è 0 deve posizionarsi sul valore in gradi rappresentato dalla Costante "INIZIALE", tenendo conto che qui 0° è posto tra il I e il IV Quadrante del piano cartesiano: c = (n + INIZIALE) With Paint .Brush = .Color(Color.DarkBlue) ' Disegna il cerchietto interno: .LineWidth = 4.0 .Ellipse(x - 4, y - 4, 8, 8, 0, 360, False) .Stroke ' Disegna il cerchio esterno: .LineWidth = 12.0 .Ellipse(x - ((RAGGIO * AUM_RAGG) / 2), y - ((RAGGIO * AUM_RAGG) / 2), RAGGIO * AUM_RAGG, RAGGIO * AUM_RAGG, 0, 360, False) .Stroke ' Disegna i valori: .Brush = .Color(Color.DarkBlue) .Font.Size = 8.0 r2 = RAGGIO * 0.8 For t = INIZIALE To (INIZIALE + ARCO) Step PASSO .DrawText(CStr(Fix(t - INIZIALE) \ (ARCO \ VALORI)), (x - 2) + (r2 * Cos(Rad(t))), (y - 1) + (r2 * Sin(Rad(t))), 5, 5, Align.Center) Next .Stroke ' Disegna l'arco con i 3 colori: .LineWidth = 12.0 r2 = RAGGIO * 0.95 For b = 0 To 6 Step 3 .Brush = .Color(ii[b]) .Arc(x, y, r2, Rad(ii[b + 1]), Rad(ii[b + 2]), False) .Stroke Next ' Disegna la lancetta: .Brush = .Color(Color.Red) .LineWidth = 1.0 .MoveTo(x, y) .LineTo(x + (RAGGIO * Cos(Rad(c))), y + (RAGGIO * Sin(Rad(c)))) .Stroke ' Disegna i numeri: .DrawText(CStr(Fix(n / (ARCO / VALORI))), x - 3, y + 20, 10, 10, Align.Center) .End End With End
Per far ruotare la lancetta indicatrice, cliccare all'altezza dello zero del quadrante e, mantenendo premuto il tasto sinistro del mouse, spostarsi in verticale.
2° esempio
Quest'altro esempio, molto essenziale, modificato su un codice iniziale creato dal membro cogier del forum https://forum.gambas.one/index.php.
Private DrawingArea1 As DrawingArea Private Slider1 As Slider Public Sub Form_Open() With Me .Height = 300 .Width = 300 .Padding = 5 .Arrangement = Arrange.Vertical .Center End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Expand = True End With With Slider1 = New Slider(Me) As "Slider1" .Height = 20 .MaxValue = 360 End With End Public Sub Slider1_Change() DrawingArea1.Refresh End Public Sub DrawingArea1_Draw() Dim cx As Integer = DrawingArea1.W / 2 ' Centro orizzontale Dim cy As Integer = DrawingArea1.H / 2 ' Centro verticale With Paint .Translate(cx, cy) .Rotate(-Slider1.value / ((360 * 100) / 630)) .Translate(-cx, -cy) .Brush = Paint.Color(Color.Red) .MoveTo(CX, CY - 80) .LineTo(cx + 10, cy) .LineTo(cx, cy + 20) .LineTo(cx - 10, cy) .LineTo(cx, cy - 80) .Fill .Brush = Paint.Color(Color.Black) .MoveTo(CX, CY - 80) .LineTo(cx + 10, cy) .LineTo(cx, cy + 20) .LineTo(cx - 10, cy) .LineTo(cx, cy - 80) .lineto(cx, cy + 20) .Stroke .End End With End