Csharp/C Sharp/2D Graphics/Clip

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

Clip Draw

<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 ClipDraw_c {

   /// <summary>
   /// Summary description for ClipDraw_c.
   /// </summary>
   public class ClipDraw_c : System.Windows.Forms.Form
   {
       private System.Windows.Forms.Button B1;
       private System.Windows.Forms.Button B2;
       private System.Windows.Forms.Button B3;
       
       internal System.Windows.Forms.Button B4;
       internal System.Windows.Forms.Button B5;
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       public ClipDraw_c() {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
           this.MouseMove += new MouseEventHandler(this.ClipDraw_cMouse);
       }
       /// <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()
       {
           this.B1 = new System.Windows.Forms.Button();
           this.B2 = new System.Windows.Forms.Button();
           this.B3 = new System.Windows.Forms.Button();
           this.B4 = new System.Windows.Forms.Button();
           this.B5 = new System.Windows.Forms.Button();
           this.SuspendLayout();
             // 
           // B1
           // 
           this.B1.Location = new System.Drawing.Point(16, 232);
           this.B1.Name = "B1";
           this.B1.Size = new System.Drawing.Size(56, 24);
           this.B1.TabIndex = 0;
           this.B1.Text = "Clip";
           this.B1.Click += new System.EventHandler(this.B1_Click);
           // 
           // B2
           // 
           this.B2.Location = new System.Drawing.Point(96, 232);
           this.B2.Name = "B2";
           this.B2.Size = new System.Drawing.Size(56, 24);
           this.B2.TabIndex = 1;
           this.B2.Text = "SetClip";
           this.B2.Click += new System.EventHandler(this.B2_Click);
           // 
           // B3
           // 
           this.B3.Location = new System.Drawing.Point(176, 232);
           this.B3.Name = "B3";
           this.B3.Size = new System.Drawing.Size(88, 24);
           this.B3.TabIndex = 2;
           this.B3.Text = "ExcludeClip";
           this.B3.Click += new System.EventHandler(this.B3_Click);
           // 
           // B4
           // 
           this.B4.Location = new System.Drawing.Point(176, 200);
           this.B4.Name = "B4";
           this.B4.Size = new System.Drawing.Size(88, 24);
           this.B4.TabIndex = 4;
           this.B4.Text = "Intersect";
           this.B4.Click += new System.EventHandler(this.B4_Click);
           // 
           // B5
           // 
           this.B5.Location = new System.Drawing.Point(280, 232);
           this.B5.Name = "B5";
           this.B5.Size = new System.Drawing.Size(88, 24);
           this.B5.TabIndex = 5;
           this.B5.Text = "IntersectClip";
           this.B5.Click += new System.EventHandler(this.B5_Click);
           // 
           // ClipDraw_c
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(376, 273);
           this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                 this.B5,
                                                                 this.B4,
                                                                 this.B3,
                                                                 this.B2,
                                                                 this.B1});
           this.Name = "ClipDraw_c";
           this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
           this.Text = "ClipDraw_c";
           this.Load += new System.EventHandler(this.ClipDraw_c_Load);
           this.ResumeLayout(false);
       }
       #endregion
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
       static void Main() 
       {
           Application.Run(new ClipDraw_c());
       }
       private Graphics G_obj;
       private void ClipDraw_c_Load(object sender, System.EventArgs e)
       {
   
       }
       private void ClipDraw_cMouse(System.Object sender , MouseEventArgs e) 
       {
           if (G_obj == null)
               return;
           if (G_obj.IsVisible(e.X, e.Y))
               G_obj.FillRectangle(Brushes.BlueViolet, e.X, e.Y, 1, 1);
       }
       private void B1_Click(object sender, System.EventArgs e)
       {
           Graphics G  = this.CreateGraphics();
           Rectangle R = new Rectangle(50, 50, 100, 100);
           G.Clear(Color.Gainsboro);
           //Outline the rectangle and create the clipping region
           G.DrawRectangle(Pens.Black, R);
           G.Clip = new Region(R);
           //Draw line the sidth of the form
           G.DrawLine(Pens.Blue, 0, 75, this.Width, 75);
           //Draw a circle 1/4 inside clipping region
           G.FillEllipse(Brushes.LawnGreen, new Rectangle(75, 75, 150, 150));
           G.Dispose();    
       }
       private void B2_Click(object sender, System.EventArgs e)
       {
           Graphics G = this.CreateGraphics();
           Rectangle R = new Rectangle(20, 20, 100, 100);
           GraphicsPath path = new GraphicsPath();
           G.Clear(Color.Gainsboro);
           path.AddEllipse(R);
           G.DrawPath(Pens.Black, path);
           G.SetClip(path);
           // Draw some clipped strings.
           Font F = new Font("Arial", 16);
           G.DrawString("ABCDEFGHIJKLM", F, Brushes.DeepPink, 15, 25);
           G.DrawString("NOPQRSTUVWXYZ", F, Brushes.DeepPink, 15, 68);
           path.Dispose();
       }
       private void B3_Click(object sender, System.EventArgs e)
       {
           Graphics G = this.CreateGraphics();
           Rectangle R = new Rectangle(40, 20, 100, 100);
           GraphicsPath path = new GraphicsPath();
           G.Clear(Color.Gainsboro);
           path.AddEllipse(R);
           G.DrawPath(Pens.Black, path);
           G.ExcludeClip(new Region(path));
           // Draw some clipped strings.
           Font F = new Font("Arial", 16);
           G.DrawString("ABCDEFGHIJKLM", F, Brushes.DeepPink, 15, 25);
           G.DrawString("NOPQRSTUVWXYZ", F, Brushes.DeepPink, 15, 68);
           path.Dispose();    
           F.Dispose();
       }
       private void B4_Click(object sender, System.EventArgs e)
       {
     Graphics G = this.CreateGraphics();
     Rectangle R = new Rectangle(40, 20, 100, 100);
     Rectangle R2 = new Rectangle(60, 20, 120, 120);
     GraphicsPath P1 = new GraphicsPath();
     GraphicsPath P2 = new GraphicsPath();
     G.Clear(Color.Gainsboro);
     P1.AddEllipse(R);
     G.DrawPath(Pens.Black, P1);
     P2.AddEllipse(R2);
     G.DrawPath(Pens.Black, P2);
     G.SetClip(P1);
     G.SetClip(P2, CombineMode.Intersect);
     // Draw some clipped strings.
     Font F = new Font("Arial", 16);
     G.DrawString("ABCDEFGHIJKLM", F, Brushes.DeepPink, 15, 25);
     G.DrawString("NOPQRSTUVWXYZ", F, Brushes.DeepPink, 15, 68);
     G_obj = G;
     F.Dispose();
     P1.Dispose();     
     P2.Dispose();     
   }
   private void B5_Click(object sender, System.EventArgs e)
   {
     //Bail out if not set
     if (G_obj == null )
       return;
     Rectangle R2 = new Rectangle(75, 75, 150, 150);
     G_obj.IntersectClip(R2);
     G_obj.FillRectangle(new SolidBrush(Color.Blue), 0, 0, 500, 500);
   }
   }

}


      </source>


Clipping

<source lang="csharp"> /* Professional Windows GUI Programming Using C# by Jay Glynn, Csaba Torok, Richard Conway, Wahid Choudhury,

  Zach Greenvoss, Shripad Kulkarni, Neil Whitlow

Publisher: Peer Information ISBN: 1861007663

  • /

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

   /// <summary>
   /// Summary description for Clipping.
   /// </summary>
   public class Clipping : System.Windows.Forms.Form
   {
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       GraphicsPath gP;
       public Clipping()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           this.Text = "Transform and Clip";
           //
           // 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()
       {
           // 
           // Clipping
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(292, 149);
           this.Name = "Clipping";
           this.Text = "Clipping";
       }
       #endregion
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
       static void Main() 
       {
           Application.Run(new Clipping());
       }
       protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
       {
           Graphics g = e.Graphics;
           DrawPathTransform(g);
           //DrawClip(g);
           g.Dispose();
       }
       void AddStringToPath(string s)
       {
           int fSt = (int)FontStyle.Regular;
           Point xy = new Point(50, 10);
           FontFamily fF = new FontFamily("Times new roman");
           StringFormat sFr = StringFormat.GenericDefault;
           gP.AddString(s, fF, fSt, 100, xy, sFr);  // add the string to the path
       }
       void DrawPathTransform(Graphics g)
       {
           gP = new GraphicsPath();  // create a new path
           AddStringToPath("C#");
           g.FillPath(Brushes.Gray, gP);  // draw the path to the surface
           Matrix m = new Matrix();
           m.Translate(5, 5);
           gP.Transform(m);
           g.FillPath(Brushes.Yellow, gP);  // draw the path to the surface
           g.DrawPath(Pens.Red, gP);  // draw the path to the surface
       }
       void DrawClip(Graphics g)
       {
           gP = new GraphicsPath();  // create a new path
           AddStringToPath("C#");
           g.SetClip(gP);
           g.TranslateClip(-5, -5);
           RectangleF rc = gP.GetBounds();
           rc.Offset(-5, -5);
           g.FillRectangle(Brushes.Gray, rc);  // results in gray C#
           g.ResetClip();
           g.FillPath(Brushes.Yellow, gP);  // draw the path to the surface
           g.DrawPath(Pens.Red, gP);  // draw the path to the surface
       }
   }

}

      </source>


Clipping Combinations

<source lang="csharp"> using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;

class ClippingCombinations: Form {

    string   strCaption = "CombineMode = ";
    MenuItem miCombineMode;
  
    public static void Main()
    {
         Application.Run(new ClippingCombinations());
    }
    protected override void OnPaint(PaintEventArgs pea)
    {
         DoPage(pea.Graphics, ForeColor,ClientSize.Width, ClientSize.Height);
    }      
    public ClippingCombinations()
    {
         ResizeRedraw = true;
  
         Menu = new MainMenu();
         Menu.MenuItems.Add("&CombineMode");
  
         EventHandler ehClick = new EventHandler(MenuCombineModeOnClick);
         
         for (int i = 0; i < 6; i++)
         {
              MenuItem mi   = new MenuItem("&" + (CombineMode)i);
              mi.Click     += ehClick;
              mi.RadioCheck = true;
  
              Menu.MenuItems[0].MenuItems.Add(mi);
         }
         miCombineMode = Menu.MenuItems[0].MenuItems[0];
         miCombineMode.Checked = true;
    }
    void MenuCombineModeOnClick(object obj, EventArgs ea)
    {
         miCombineMode.Checked = false;
         miCombineMode = (MenuItem) obj;
         miCombineMode.Checked = true;
  
         Text = strCaption + (CombineMode)miCombineMode.Index;
         Invalidate();
    }
    protected void DoPage(Graphics grfx, Color clr, int cx, int cy)
    {
         GraphicsPath path = new GraphicsPath();
         path.AddEllipse(0, 0, 2 * cx / 3, cy);
         grfx.SetClip(path);
  
         path.Reset();
         path.AddEllipse(cx / 3, 0, 2 * cx / 3, cy);
         grfx.SetClip(path, (CombineMode)miCombineMode.Index);
  
         grfx.FillRectangle(Brushes.Red, 0, 0, cx, cy);
    }

}

</source>


draw something onto the drawing surface (with the clipping region applied)

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

   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   g.FillRectangle(Brushes.White, this.ClientRectangle);
   Rectangle rect = new Rectangle(10, 10, 80, 50);
   g.DrawRectangle(Pens.Black, rect);
   g.SetClip(rect);
   g.FillEllipse(Brushes.Blue, 20, 20, 100, 100);
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>


Write info about the clipping rectangle to the console window

<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; public class Form1 : Form {

   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   g.FillRectangle(Brushes.White, this.ClientRectangle);
   String s = "text";
   Font f = new Font("Times New Roman", 12);
   SizeF sf = g.MeasureString(s, f, 400);
   RectangleF rf = new RectangleF(10, 10, sf.Width, sf.Height);
   g.DrawString(s, f, Brushes.Black, rf);
   f.Dispose();
   Console.WriteLine("Clipping region painted: " + e.ClipRectangle);
   }
   public static void Main() {
       Application.Run(new Form1());
   }

}

</source>