Csharp/C Sharp/2D Graphics/Clip
Содержание
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>