/*
GDI+ Programming in C# and VB .NET
by Nick Symmonds
Publisher: Apress
ISBN: 159059035X
*/
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace GraphicsDraw_c
{
///
/// Summary description for GraphicsDraw.
///
public class GraphicsDraw : System.Windows.Forms.Form
{
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
public GraphicsDraw()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
//
// GraphicsDraw
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(504, 629);
this.Name = "GraphicsDraw";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "GraphicsDraw";
this.Load += new System.EventHandler(this.GraphicsDraw_Load);
}
#endregion
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.Run(new GraphicsDraw());
}
private void GraphicsDraw_Load(object sender, System.EventArgs e)
{
}
protected override void OnPaint(PaintEventArgs e)
{
Rectangle R1 = new Rectangle(10, 10, 40, 40);
e.Graphics.SmoothingMode=SmoothingMode.HighQuality;
e.Graphics.DrawRectangle(Pens.Black,R1);
e.Graphics.TranslateTransform(50.0F, 0.0F);
e.Graphics.FillRectangle(Brushes.Black,R1);
//Draw three rectangles
Rectangle[] ThreeRects = {new Rectangle(110, 10, 40, 40),
new Rectangle(160, 10, 40, 40),
new Rectangle(210, 10, 40, 40)};
e.Graphics.ResetTransform();
e.Graphics.DrawRectangles(Pens.Red, ThreeRects);
//Draw three filled rectangles
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(100.0F, 0.0F);
e.Graphics.FillRectangles(Brushes.Red, ThreeRects);
//Use first rect to bound ellipse as circle
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(0.0F, 50.0F);
e.Graphics.DrawEllipse(Pens.Green,R1);
//Draw a filled ellipse
e.Graphics.TranslateTransform(50.0F, 0.0F);
e.Graphics.FillEllipse(Brushes.Green,R1);
//Use first rect to bound pie
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(100.0F, 50.0F);
e.Graphics.DrawPie(Pens.DarkViolet, R1, 0, 60);
//Use first rect to fill pie
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150.0F, 50.0F);
e.Graphics.FillPie(Brushes.DarkViolet, R1, 0, 60);
//Use first rect to bound arc
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(200.0F, 50.0F);
e.Graphics.DrawArc(Pens.DarkBlue, R1, 40, 160);
PointDraw ( e.Graphics );
PathDraw ( e.Graphics );
}
private void PointDraw( Graphics G )
{
//Start with clean slate
G.ResetClip();
G.ResetTransform();
//Separate sections
G.DrawLine(Pens.Black,10,110,this.Width-10,110);
//------------ Draw Line -----------------------
//Generate start and end points
Point StartPt = new Point(10,130);
Point EndPt = new Point(200,130);
Pen P = new Pen(Brushes.CadetBlue, 5);
G.DrawLine(P, StartPt, EndPt);
//------------- Draw lines ----------------------
//Translate in the Y Direction
Size Xlate_Y = new Size(0,40);
//Translate in the X Direction
Size Xlate_X = new Size(200,0);
Point Pt = StartPt;
//Generate set of points based on offsets of original point
Point[] ManyPoints = { (Pt + Xlate_X),
(Pt = Pt + Xlate_X + Xlate_Y),
(Pt = Pt + Xlate_X) };
P.Color=Color.Firebrick;
G.DrawLines(P, ManyPoints);
//------------ DrawBezier and Polygon -------------------
StartPt.X=10;
StartPt.Y=250;
Point CtlPtA = new Point(50,150);
Point CtlPtB = new Point(350,300);
EndPt.X=400;
EndPt.Y=250;
Point[] PolyPoints = { StartPt, CtlPtA, EndPt, CtlPtB };
//Draw the controlling shape of the Bezier spline
G.DrawPolygon ( Pens.DarkSeaGreen, PolyPoints );
//Draw the actual Spline
P.Color=Color.DarkSeaGreen;
P.Width=3;
G.DrawBezier( P, StartPt, CtlPtA, CtlPtB, EndPt );
//---------- Draw two Bezier splines ---------------------
Size Y = new Size(0,40);
Size X = new Size(20,0);
//Y Translated start of first spline
//Same control points for first spline,
//X,Y Translated end of first spline,
//X Translate control points for second spline,
//X,Y New end point for second spline
Point[] TwoSplines = { StartPt+Y,
CtlPtA,
CtlPtB,
EndPt+Y-new Size(200,0),
CtlPtA+X,
CtlPtB+X,
EndPt+Y+X };
P.Color=Color.Gold;
G.DrawBeziers (P, TwoSplines);
//---------- Draw a closed curve -----------
PolyPoints[0] = new Point(100, 350);
PolyPoints[1] = new Point(250, 300);
PolyPoints[2] = new Point(250, 400);
PolyPoints[3] = new Point(150, 400);
P.Color=Color.Olive;
//Curve traces outside of polygon
//Curve is closed cardinal spline & hits all points
G.DrawPolygon (P, PolyPoints);
G.DrawClosedCurve(P,PolyPoints);
//Uncomment next line to fill the egg shape
// G.FillClosedCurve(Brushes.AliceBlue,PolyPoints);
//---------- Draw an open cardinal curve -----------
Point[] CardPoints = { new Point( 310, 350 ),
new Point( 330, 360 ),
new Point( 360, 320 ),
new Point( 390, 370 ),
new Point( 400, 350 ),
new Point( 480, 340 )};
P.Color=Color.DarkOrange;
G.DrawCurve(P, CardPoints);
P.Dispose();
}
private void PathDraw( Graphics G )
{
//Start with clean slate
G.ResetClip();
G.ResetTransform();
//Separate sections
G.DrawLine(Pens.Black, 10, 420, this.Width-10, 420);
//Make a blank path and add shapes to it
GraphicsPath gp = new GraphicsPath();
Pen P = new Pen(Brushes.ForestGreen,3);
gp.AddRectangle(new Rectangle(10, 450, 100, 100));
gp.AddEllipse(120, 450, 100, 100);
gp.AddPie ( 70, 500, 100, 100, 25, 120 );
//Draw the outline of the path and fill it in
G.DrawPath (P, gp );
G.FillPath(Brushes.Bisque,gp);
P.Dispose();
}
}
}