Csharp/C Sharp/2D Graphics/Transform

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Add a translation to the existing transformation

<source lang="csharp">

 using System;
 using System.Drawing;
 using System.Drawing.Drawing2D;
 using System.Collections;
 using System.ruponentModel;
 using System.Windows.Forms;
 using System.Data;
 using System.Drawing.Imaging;
 public class Form1 : System.Windows.Forms.Form
 {
   public Form1()
   {
     InitializeComponent();
   }
   private void InitializeComponent()
   {
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 273);
     this.Text = "";
     this.Resize += new System.EventHandler(this.Form1_Resize);
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
   }
   static void Main() 
   {
     Application.Run(new Form1());
   }
   private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
   {      
     Graphics g = e.Graphics;
     g.FillRectangle(Brushes.White, this.ClientRectangle);
     for (int i = 1; i <= 10; ++i)
     {
       // First, draw a rectangle with the current translation
       g.DrawRectangle(Pens.Black, 10, 10, 30, 50);
       // Add a translation to the existing transformation
       g.TranslateTransform(20, 10);
     }
   }
   private void Form1_Resize(object sender, System.EventArgs e)
   {
     Invalidate();
   }
 }
          
      </source>


Reset the transformation

<source lang="csharp">

 using System;
 using System.Drawing;
 using System.Drawing.Drawing2D;
 using System.Collections;
 using System.ruponentModel;
 using System.Windows.Forms;
 using System.Data;
 using System.Drawing.Imaging;
 public class Form1 : System.Windows.Forms.Form
 {
   public Form1()
   {
     InitializeComponent();
   }
   private void InitializeComponent()
   {
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 273);
     this.Text = "";
     this.Resize += new System.EventHandler(this.Form1_Resize);
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
   }
   static void Main() 
   {
     Application.Run(new Form1());
   }
   private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
   {      
     Graphics g = e.Graphics;
     g.FillRectangle(Brushes.White, ClientRectangle);
     g.DrawEllipse(Pens.Black, 20, 20, 30, 50);
     // Translate by -15 pixels in horizontal direction
     g.TranslateTransform(-15, 0);
     g.DrawEllipse(Pens.Red, 20, 20, 30, 50);
     // Reset the transformation
     // Translate by 30 pixels in vertical direction
     g.ResetTransform();
     g.TranslateTransform(0, 30);
     g.DrawEllipse(Pens.Blue, 20, 20, 30, 50);
   }
   private void Form1_Resize(object sender, System.EventArgs e)
   {
     Invalidate();
   }
 }
          
      </source>


Rotate Transform

<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Drawing.Text; namespace GDI_Basics {

   /// <summary>
   /// Summary description for RotateTransform.
   /// </summary>
   public class RotateTransform : System.Windows.Forms.Form
   {
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       public RotateTransform()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if(components != null)
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           // 
           // RotateTransform
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(292, 266);
           this.Name = "RotateTransform";
           this.Text = "RotateTransform";
           this.Paint += new System.Windows.Forms.PaintEventHandler(this.RotateTransform_Paint);
       }
       #endregion
       [STAThread]
       static void Main() 
       {
           Application.Run(new RotateTransform());
       }
       private void RotateTransform_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
       {
           // Optimize text quality.
           e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
           // Move origin to center of form so we can rotate around that.
           e.Graphics.TranslateTransform(this.Width / 2 - 30, this.Height / 2 - 30);
           DrawText(e.Graphics);
           e.Graphics.RotateTransform(45);
           DrawText(e.Graphics);
           e.Graphics.RotateTransform(75);
           DrawText(e.Graphics);
           e.Graphics.RotateTransform(160);
           DrawText(e.Graphics);
       }
       private void DrawText(Graphics g)
       {
           g.DrawString("Text", new Font("Verdana", 30, FontStyle.Bold), 
               Brushes.Black, 0, 10);
       }
   }

}


      </source>


Shape and Transform

<source lang="csharp"> /* 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.ruponentModel; using System.Windows.Forms; using System.Data; namespace GraphicsDraw_c {

   /// <summary>
   /// Summary description for GraphicsDraw.
   /// </summary>
   public class GraphicsDraw : System.Windows.Forms.Form
   {
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       public GraphicsDraw()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if (components != null) 
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       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
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [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();
   }
   }

}


      </source>


Translate the text 150 pixels horizontally and 75 vertically

<source lang="csharp">

 using System;
 using System.Drawing;
 using System.Drawing.Drawing2D;
 using System.Collections;
 using System.ruponentModel;
 using System.Windows.Forms;
 using System.Data;
 using System.Drawing.Imaging;
 public class Form1 : System.Windows.Forms.Form
 {
   public Form1()
   {
     InitializeComponent();
   }
   private void InitializeComponent()
   {
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 273);
     this.Text = "";
     this.Resize += new System.EventHandler(this.Form1_Resize);
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
   }
   static void Main() 
   {
     Application.Run(new Form1());
   }
   private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
   {      
     Graphics g = e.Graphics;
     g.FillRectangle(Brushes.White, this.ClientRectangle);
     Font f = new Font("Times New Roman", 24);
     // Draw text to the surface
     g.DrawString("www.nfex.ru", f, Brushes.Black, 0, 0);
     // Translate the text 150 pixels horizontally and 75 vertically
     g.TranslateTransform(150, 75);
     // Draw the translated text
     g.DrawString("www.nfex.ru", f, Brushes.Black, 0, 0);
   }
   private void Form1_Resize(object sender, System.EventArgs e)
   {
     Invalidate();
   }
 }


      </source>


Translate Transform

<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace GDI_Basics {

   /// <summary>
   /// Summary description for TranslateTransform.
   /// </summary>
   public class TranslateTransform : System.Windows.Forms.Form
   {
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       public TranslateTransform()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if(components != null)
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           // 
           // TranslateTransform
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(292, 266);
           this.Name = "TranslateTransform";
           this.Text = "TranslateTransform";
           this.Paint += new System.Windows.Forms.PaintEventHandler(this.TranslateTransform_Paint);
       }
       #endregion
       private void TranslateTransform_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
       {
           // Draw several squares in different places.
           DrawRectangle(e.Graphics);
           e.Graphics.TranslateTransform(180, 60);
           DrawRectangle(e.Graphics);
           e.Graphics.TranslateTransform(-50, 80);
           DrawRectangle(e.Graphics);
           e.Graphics.TranslateTransform(-100, 50);
           DrawRectangle(e.Graphics);
       }
       private void DrawRectangle(Graphics g)
       {
           Pen drawingPen = new Pen(Color.Red, 30);
           // Draw a rectangle at a fixed position.
           g.DrawRectangle(drawingPen, new Rectangle(20, 20, 20, 20));
       }
       [STAThread]
       static void Main() 
       {
           Application.Run(new TranslateTransform());
       }
   }

}


      </source>


Translate Transform three times

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using System.Drawing.Drawing2D; using System.Drawing.Text; public class Form1 : Form {

     public Form1() {
           InitializeComponent();
     }
   private void SimpleStyleRenderer_Paint(object sender, PaintEventArgs e)
   {
     e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
     DrawRectangle(e.Graphics);
     e.Graphics.TranslateTransform(180, 60);
     DrawRectangle(e.Graphics);
     e.Graphics.TranslateTransform(-50, 80);
     DrawRectangle(e.Graphics);
     e.Graphics.TranslateTransform(-100, 50);
     DrawRectangle(e.Graphics);
   }
   private void DrawRectangle(Graphics g)
   {
     Pen drawingPen = new Pen(Color.Red, 30);
     g.DrawRectangle(drawingPen, new Rectangle(20, 20, 20, 20));
   }
   private void InitializeComponent()
   {
     this.SuspendLayout();
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
     this.ClientSize = new System.Drawing.Size(600, 600);
     this.Name = "SimpleStyleRenderer";
     this.Text = "SimpleStyleRenderer";
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.SimpleStyleRenderer_Paint);
     this.ResumeLayout(false);
   }
     [STAThread]
     static void Main()
     {
       Application.EnableVisualStyles();
       Application.Run(new Form1());
     }

}


      </source>