CSharp:Windows Form GDI+
From Aino Wiki
Contents
Teoria
Si introducono la tipologia di applicazioni nelle quali, mediante l'utilizzo della grafica di punti, linee e poligoni, si possono creare disegni tecnici, grafici, giochi.
La libreria di riferimento è la Windows GDI+ (Graphics Display Interface). Le applicazioni basate su GDI+, l'API Microsoft Win32, non accedono direttamente all'hardware grafico ma si interagisce con i driver di dispositivo per conto delle applicazioni per cui si è agevolati da una astrazione universale.
Qualche fonte:
- microsoft.com
- Esempio Tutorial GDI per principianti
- Esempio c-sharpcorner.com
GDI+ resiede nell'assembly System.Drawing.dll.
Si inizia
Come prima cosa useremo le Windows Form mediante le quali creeremo gli oggetti grafici contenuti in essi.
La classe grafica per GDI+ incapsula le superfici "disegnabili". Quindi, prima di disegnare un qualsiasi oggetto (un cerchio, un rettangolo) dobbiamo creare una "superficie" utilizzando la classe Graphics. Generalmente si usa l'evento 'Paint' della Windows Form per creare una referenza alla grafica. Una via alternativa è fare l'override del metodo 'OnPaint'.
La superficie, che può essere banalmente la stessa Form, è un area che parte in alto a sx con un punto di coordinate (0,0) per finire in basso a dx con coordinate (z,w) dove z è il massimo valore di ordinate e w il massimo valore di ascisse.
Passo Passo
Usando l'evento Paint della Form
Il seguente esempio è una form con su una ellisse rossa. Dopo aver creato una applicazione Windows Form di prova nella classe di Default "Form1.cs" avremo:
using System; using System.Drawing; // <---- !!! using System.Windows.Forms; namespace WF_Graphic { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } } }
Quindi aprire il file "Form1.Designer.cs" ed aggiungere quanto segue racchiuso tra commenti:
private void InitializeComponent() { this.SuspendLayout(); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); // Aggiunta ... dopo aver digitato "+=" segure il suggerimento quindi creare il metodo "Form1_Paint" this.Paint += Form1_Paint; //----------------------------------- this.ResumeLayout(false); }
Tornare al file "Form1.cs" e copiavici il metodo creato prima col suggerimento come segue
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } //--------------------- Aggiunta private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; g.DrawEllipse(Pens.Red, 10, 10, 150, 100); } //--------------------- Fine aggiunta }
Eseguita l'applicazione con CTRL+F5 avremo una ellisse disegnata nel form principale dell'applicazione.
Si è usato il metodo DrawEllipse
per disegnare l'elisse ma si poteva sceglierte tra uno dei seguenti:
DrawArc | Draws an arc from the specified ellipse. |
DrawBezier | Draws a cubic bezier curve. |
DrawBeziers | Draws a series of cubic Bezier curves. |
DrawClosedCurve | Draws a closed curve defined by an array of points. |
DrawCurve | Draws a curve defined by an array of points. |
DrawEllipse | Draws an ellipse. |
DrawImage | Draws an image. |
DrawLine | Draws a line. |
DrawPath | Draws the lines and curves defined by a GraphicsPath. |
DrawPie | Draws the outline of a pie section. |
DrawPolygon | Draws the outline of a polygon. |
DrawRectangle | Draws the outline of a rectangle. |
DrawString | Draws a string. |
FillEllipse | Fills the interior of an ellipse defined by a bounding rectangle. |
FillPath | Fills the interior of a path. |
FillPie | Fills the interior of a pie section. |
FillPolygon | Fills the interior of a polygon defined by an array of points. |
FillRectangle | Fills the interior of a rectangle with a Brush. |
FillRectangles | Fills the interiors of a series of rectangles with a Brush. |
FillRegion | Fills the interior of a Region. |
Esempio rettangolo che si sposta con pulsanti
Esempio di una applicazione che sposta un quadrato posto in un form utilizzando 4 pulsanti che simulano le frecce. In questo esempio si riportano le coordinate in una status bar (notare: 'SStrpLbl_X' e 'SStrpLbl_Y') posta sotto il Form principale.
Creare una applicazione Windows Form ed inserire il seguente codice.
using System; using System.Drawing; using System.Windows.Forms; namespace WF_Graphic { public partial class FrmMain : Form { private int m_x = 20; private int m_y = 20; private int m_w = 50; private int m_h = 50; public Brush RectangleBrush = Brushes.DeepSkyBlue; public FrmMain() { InitializeComponent(); Paint += FrmMain_Paint1; } private void FrmMain_Load(object sender, EventArgs e) { } private void FrmMain_Paint1(object sender, PaintEventArgs e) { // Create rectangle. Rectangle rect1 = new Rectangle(m_x, m_y, m_w, m_h); SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); // Draw rectangle to screen. e.Graphics.FillRectangle(RectangleBrush, rect1); } private void BtnDown_Click(object sender, EventArgs e) { m_y = m_y +2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } private void BtnUp_Click(object sender, EventArgs e) { m_y = m_y - 2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } private void BtnRight_Click(object sender, EventArgs e) { m_x = m_x + 2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } private void BtnLeft_Click(object sender, EventArgs e) { m_x = m_x - 2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } } }
Variante con movimento da tastiera:
using System; using System.Drawing; using System.Windows.Forms; namespace WF_Graphic { public partial class FrmMain : Form { private int m_x = 20; private int m_y = 20; private int m_w = 50; private int m_h = 50; public Brush RectangleBrush = Brushes.DeepSkyBlue; public FrmMain() { this.KeyPreview = true; InitializeComponent(); Paint += FrmMain_Paint; this.KeyDown += FrmMain_KeyDown; } private void FrmMain_Load(object sender, EventArgs e) { } #region Handlers private void FrmMain_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Left: MoveLeft(); break; case Keys.Right: MoveRight(); break; case Keys.Up: MoveUp(); break; case Keys.Down: MoveDown(); break; } } private void FrmMain_Paint(object sender, PaintEventArgs e) { // Create rectangle. Rectangle rect1 = new Rectangle(m_x, m_y, m_w, m_h); SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); // Draw rectangle to screen. e.Graphics.FillRectangle(RectangleBrush, rect1); } #endregion #region Private methods private void MoveUp() { m_y = m_y - 2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } private void MoveDown() { m_y = m_y + 2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } private void MoveLeft() { m_x = m_x - 2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } private void MoveRight() { m_x = m_x + 2; SStrpLbl_X.Text = m_x.ToString(); SStrpLbl_Y.Text = m_y.ToString(); Refresh(); } #endregion } }
etc
Mappa e Link
Applicazioni Grafiche | C# | Windows Form
Visual Studio | MS SQL | Dizionario
Parole chiave: Applicazione grafiche, giochi