Csharp/C Sharp/2D Graphics/Clip
Содержание
Clip Draw
/*
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);
}
}
}
Clipping
/*
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
}
}
}
Clipping Combinations
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);
}
}
draw something onto the drawing surface (with the clipping region applied)
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());
}
}
Write info about the clipping rectangle to the console window
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());
}
}