Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

CSharp:Windows Form GDI+

From Aino Wiki

Jump to: navigation, search

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:

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

Author