Csharp/C Sharp/2D Graphics/Region
Версия от 18:31, 26 мая 2010; (обсуждение)
Содержание
- 1 Create a Region whose boundary is the GraphicsPath
- 2 Fill a Region
- 3 Fill region
- 4 Get Clipping region painted
- 5 Get repainted regions
- 6 Is a point visible to a Region
- 7 Is Region Empty
- 8 Is Region finite
- 9 Is this Rectangle visible to the Region
- 10 Region Clips
- 11 Region clips a text path
- 12 Region Excludes
- 13 Region Unions
Create a Region whose boundary is the GraphicsPath
<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); GraphicsPath gp = new GraphicsPath(); // Create an open figure gp.AddLine(10, 10, 10, 50); gp.AddLine(10, 50, 50, 50); // Start a new figure gp.StartFigure(); gp.AddLine(60, 10, 60, 50); gp.AddLine(60, 50, 100, 50); gp.CloseFigure(); gp.AddEllipse(new Rectangle(110, 10, 40, 40)); // Create a Region whose boundary is the above GraphicsPath Region reg = new Region(gp); g.FillRegion(Brushes.Green, reg); reg.Dispose(); gp.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } } </source>
Fill a Region
<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); GraphicsPath gp = new GraphicsPath(); gp.AddLine(10, 10, 10, 50); gp.AddBezier(10, 50, 120, 55, 25, 70, 30, 70); gp.AddLine(30, 70, 60, 70); gp.AddBezier(60, 70, 305, 70, 90, 55, 90, 50); gp.AddLine(90, 50, 90, 30); gp.StartFigure(); gp.AddLine(60, 110, 40, 160); gp.AddLine(40, 160, 60, 180); // Create a Region whose boundary is the above GraphicsPath Region reg = new Region(gp); g.FillRegion(Brushes.Green, reg); reg.Dispose(); gp.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
</source>
Fill region
<source lang="csharp"> using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Drawing2D;
public class Form1 : System.Windows.Forms.Form {
private System.ruponentModel.Container components = null; public Form1() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } protected override void OnPaint ( PaintEventArgs e) { Rectangle r1 = new Rectangle(10, 10, 50, 50); Rectangle r2 = new Rectangle(40, 40, 50, 50); Region r = new Region(r1); r.Union(r2); GraphicsPath path = new GraphicsPath(new Point[] {new Point(45, 45), new Point(145, 55), new Point(200, 150), new Point(75, 150), new Point(45, 45) }, new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Line }); r.Union(path); e.Graphics.FillRegion(Brushes.Blue, r); } private void InitializeComponent() { this.ruponents = new System.ruponentModel.Container(); this.Size = new System.Drawing.Size(300,300); this.Text = "Form1"; } static void Main() { Application.Run(new Form1()); }
}
</source>
Get Clipping region painted
<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); String s = "Create the necessary objects to draw the text string"; Font f = new Font("Times New Roman", 12); SizeF sf = g.MeasureString(s, f, 100); 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); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
</source>
Get repainted regions
<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); SizeF sizeF = g.MeasureString("AA", this.Font); StringFormat sf = new StringFormat(); sf.LineAlignment = StringAlignment.Center; // Set properties of the grid int cellHeight = (int)sizeF.Height + 200; int cellWidth = 200; int nbrColumns = 50; int nbrRows = 50; // Output general info to console Console.WriteLine("-------------------------------------------"); Console.WriteLine("e.ClipRectangle = " + e.ClipRectangle); Console.WriteLine("The following cells need to be redrawn " + "(in whole or in part):"); // Draw the cells and the output to console for (int row = 0; row < nbrRows; ++row) { for (int col = 0; col < nbrColumns; ++col) { Point cellLocation = new Point(col * cellWidth, row * cellHeight); Rectangle cellRect = new Rectangle(cellLocation.X, cellLocation.Y, cellWidth, cellHeight); if (cellRect.IntersectsWith(e.ClipRectangle)) { Console.WriteLine("Row:{0} Col:{1}", row, col); g.FillRectangle(Brushes.White, cellRect); g.DrawRectangle(Pens.Black, cellRect); String s = String.Format("{0},{1}", col, row); g.DrawString(s, this.Font, Brushes.Black, cellRect, sf); } } } } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } } </source>
Is a point visible to a Region
<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); Region r = new Region(new Rectangle(30, 30, 30, 60)); r.Exclude(new Rectangle(40, 40, 10, 10)); g.FillRegion(Brushes.Orange, r); PointF pf = new PointF(35.0f, 30.0f); Console.WriteLine((r.IsVisible(pf) ? " - includes" : " - excludes") + " the point (35.0, 50.0)"); r.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
</source>
Is Region Empty
<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); Region r = new Region(new Rectangle(30, 30, 30, 60)); r.Exclude(new Rectangle(40, 40, 10, 10)); g.FillRegion(Brushes.Orange, r); Console.WriteLine(r.IsEmpty(g) ? " - is empty" : " - is non-empty"); r.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
</source>
Is Region finite
<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); Region r = new Region(new Rectangle(30, 30, 30, 60)); r.Exclude(new Rectangle(40, 40, 10, 10)); g.FillRegion(Brushes.Orange, r); Console.WriteLine(r.IsInfinite(g) ? " - is infinite" : " - is finite"); r.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
</source>
Is this Rectangle visible to the Region
<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); Region r = new Region(new Rectangle(30, 30, 30, 60)); r.Exclude(new Rectangle(40, 40, 10, 10)); g.FillRegion(Brushes.Orange, r); Rectangle rect = new Rectangle(25, 65, 5, 5); g.DrawRectangle(Pens.Black, rect); Console.WriteLine((r.IsVisible(rect) ? " - is visible" : " - is invisible") + " in the rectangle shown"); r.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } } </source>
Region Clips
<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); Rectangle rect = new Rectangle(10, 10, 80, 80); g.DrawRectangle(Pens.Black, rect); g.SetClip(rect); g.FillEllipse(Brushes.Blue, 20, 20, 100, 100); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
</source>
Region clips a text path
<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); GraphicsPath gp = new GraphicsPath(); gp.AddString("www.nfex.ru", new FontFamily("Times New Roman"), (int)(FontStyle.Bold | FontStyle.Italic), 144, new Point(5, 5), StringFormat.GenericTypographic); g.SetClip(gp); g.DrawImage(new Bitmap("winter.jpg"), this.ClientRectangle); gp.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } } </source>
Region Excludes
<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); Region r = new Region(new Rectangle(30, 30, 30, 60)); r.Exclude(new Rectangle(40, 40, 10, 10)); g.FillRegion(Brushes.Orange, r); r.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } } </source>
Region Unions
<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); Region reg = new Region(); reg.MakeEmpty(); GraphicsPath gp = new GraphicsPath(); gp.AddEllipse(10, 10, 50, 50); reg.Union(gp); gp.Reset(); gp.AddLine(40, 40, 70, 10); gp.AddLine(70, 10, 140, 140); gp.CloseFigure(); reg.Union(gp); reg.Union(new Rectangle(40, 50, 60, 60)); // Set the clipping region g.SetClip(reg, CombineMode.Replace); g.FillRectangle(Brushes.Green, this.ClientRectangle); gp.Dispose(); reg.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
</source>