Csharp/C Sharp/2D Graphics/Mouse Draw
Содержание
Drag and draw
<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 {
bool shouldPaint = false; public Form1() { InitializeComponent(); } private void PainterForm_MouseDown( object sender, MouseEventArgs e ) { shouldPaint = true; } private void PainterForm_MouseUp( object sender, MouseEventArgs e ) { shouldPaint = false; } private void PainterForm_MouseMove( object sender, MouseEventArgs e ) { if ( shouldPaint ) { Graphics graphics = CreateGraphics(); graphics.FillEllipse(new SolidBrush( Color.BlueViolet ), e.X, e.Y, 4, 4 ); graphics.Dispose(); } } 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(184, 180); this.Name = "PainterForm"; this.Text = "Painter"; this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PainterForm_MouseDown); this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.PainterForm_MouseUp); this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PainterForm_MouseMove); this.ResumeLayout(false); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); }
}
</source>
Drawing Shapes
<source lang="csharp"> /* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457
- /
using System.Drawing; using System.Drawing.Drawing2D; using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data;
/// <summary> /// Summary description for DrawingShapes. /// </summary> public class DrawingShapes : System.Windows.Forms.Form { internal System.Windows.Forms.ContextMenu mnuLabel; internal System.Windows.Forms.MenuItem mnuColorChange; internal System.Windows.Forms.ContextMenu mnuForm; internal System.Windows.Forms.MenuItem mnuRectangle; internal System.Windows.Forms.MenuItem mnuEllipse; internal System.Windows.Forms.MenuItem mnuTriangle; private System.Windows.Forms.MenuItem mnuRemoveShape; /// <summary> /// Required designer variable. /// </summary> private System.ruponentModel.Container components = null; public DrawingShapes() { // // 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() { this.mnuLabel = new System.Windows.Forms.ContextMenu(); this.mnuColorChange = new System.Windows.Forms.MenuItem(); this.mnuForm = new System.Windows.Forms.ContextMenu(); this.mnuRectangle = new System.Windows.Forms.MenuItem(); this.mnuEllipse = new System.Windows.Forms.MenuItem(); this.mnuTriangle = new System.Windows.Forms.MenuItem(); this.mnuRemoveShape = new System.Windows.Forms.MenuItem(); // // mnuLabel // this.mnuLabel.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.mnuColorChange, this.mnuRemoveShape}); // // mnuColorChange // this.mnuColorChange.Index = 0; this.mnuColorChange.Text = "Change Color"; this.mnuColorChange.Click += new System.EventHandler(this.mnuColorChange_Click); // // mnuForm // this.mnuForm.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.mnuRectangle, this.mnuEllipse, this.mnuTriangle}); // // mnuRectangle // this.mnuRectangle.Index = 0; this.mnuRectangle.Text = "Create New Rectangle"; this.mnuRectangle.Click += new System.EventHandler(this.mnuNewShape_Click); // // mnuEllipse // this.mnuEllipse.Index = 1; this.mnuEllipse.Text = "Create New Ellipse"; this.mnuEllipse.Click += new System.EventHandler(this.mnuNewShape_Click); // // mnuTriangle // this.mnuTriangle.Index = 2; this.mnuTriangle.Text = "Create New Triangle"; this.mnuTriangle.Click += new System.EventHandler(this.mnuNewShape_Click); // // mnuRemoveShape // this.mnuRemoveShape.Index = 1; this.mnuRemoveShape.Text = "Remove Shape"; this.mnuRemoveShape.Click += new System.EventHandler(this.mnuRemoveShape_Click); // // DrawingShapes // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(628, 426); this.ContextMenu = this.mnuForm; this.Name = "DrawingShapes"; this.Text = "DrawingShapes"; this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DrawingShapes_MouseDown); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new DrawingShapes()); }
// Keep track of when fake drag or resize mode is enabled. private bool isDragging = false; private bool isResizing = false; // Store the location where the user clicked on the control. private int clickOffsetX, clickOffsetY; private void lbl_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e) { // Retrieve a reference to the active label. Control currentCtrl; currentCtrl = (Control)sender; if (e.Button == MouseButtons.Right) { // Show the context menu. currentCtrl.ContextMenu.Show(currentCtrl, new Point(e.X, e.Y)); } else if (e.Button == MouseButtons.Left) { clickOffsetX = e.X; clickOffsetY = e.Y; if ((e.X + 5) > currentCtrl.Width || (e.Y + 5) > currentCtrl.Height) { // The mouse pointer is in the bottom right corner, // so resizing mode is appropriate. isResizing = true; } else { // The mouse is somewhere else, so dragging mode is // appropriate. isDragging = true; } } } private void lbl_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { // Retrieve a reference to the active shape. Control currentCtrl; currentCtrl = (Control)sender; if (isDragging) { // Move the control. currentCtrl.Left = e.X + currentCtrl.Left - clickOffsetX; currentCtrl.Top = e.Y + currentCtrl.Top - clickOffsetY; } else if (isResizing) { // Resize the control, according to the resize mode. if (currentCtrl.Cursor == Cursors.SizeNWSE) { currentCtrl.Width = e.X; currentCtrl.Height = e.Y; } else if (currentCtrl.Cursor == Cursors.SizeNS) { currentCtrl.Height = e.Y; } else if (currentCtrl.Cursor == Cursors.SizeWE) { currentCtrl.Width = e.X; } } else { // Change the cursor if the mouse pointer is on one of the edges // of the control. if (((e.X + 5) > currentCtrl.Width) && ((e.Y + 5) > currentCtrl.Height)) { currentCtrl.Cursor = Cursors.SizeNWSE; } else if ((e.X + 5) > currentCtrl.Width) { currentCtrl.Cursor = Cursors.SizeWE; } else if ((e.Y + 5) > currentCtrl.Height) { currentCtrl.Cursor = Cursors.SizeNS; } else { currentCtrl.Cursor = Cursors.Arrow; } } } private void lbl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { isDragging = false; isResizing = false; } private void mnuColorChange_Click(object sender, System.EventArgs e) { // Show color dialog. ColorDialog dlgColor = new ColorDialog(); dlgColor.ShowDialog(); // Change label background. mnuLabel.SourceControl.BackColor = dlgColor.Color; } private void DrawingShapes_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Right) { this.ContextMenu.Show(this, new Point(e.X, e.Y)); } } private void mnuNewShape_Click(object sender, System.EventArgs e) { // Create and configure the shape with some defaults. Shape newShape = new Shape(); newShape.Size = new Size(40, 40); newShape.ForeColor = Color.Coral; // Configure the appropriate shape depending on the menu option selected. if (sender == mnuRectangle) { newShape.Type = Shape.ShapeType.Rectangle; } else if (sender == mnuEllipse) { newShape.Type = Shape.ShapeType.Ellipse; } else if (sender == mnuTriangle) { newShape.Type = Shape.ShapeType.Triangle; } // To determine where to place the shape, you need to convert the // current screen-based mouse coordinates into relative form coordinates. newShape.Location = this.PointToClient(Control.MousePosition); // Attach a context menu to the shape. newShape.ContextMenu = mnuLabel; // Connect the shape to all its event handlers. newShape.MouseDown += new MouseEventHandler(lbl_MouseDown); newShape.MouseMove += new MouseEventHandler(lbl_MouseMove); newShape.MouseUp += new MouseEventHandler(lbl_MouseUp); // Add the shape to the form. this.Controls.Add(newShape); } private void mnuRemoveShape_Click(object sender, System.EventArgs e) { Shape ctrlShape = (Shape)mnuLabel.SourceControl; this.Controls.Remove(ctrlShape); } } public class Shape : System.Windows.Forms.UserControl { // The types of shapes supported by this control. public enum ShapeType { Rectangle, Ellipse, Triangle } private ShapeType shape = ShapeType.Rectangle; private GraphicsPath path = null; public ShapeType Type { get { return shape; } set { shape = value; RefreshPath(); this.Invalidate(); } } // Create the corresponding GraphicsPath for the shape, and apply // it to the control by setting the Region property. private void RefreshPath() { path = new GraphicsPath(); switch (shape) { case ShapeType.Rectangle: path.AddRectangle(this.ClientRectangle); break; case ShapeType.Ellipse: path.AddEllipse(this.ClientRectangle); break; case ShapeType.Triangle: Point pt1 = new Point(this.Width / 2, 0); Point pt2 = new Point(0, this.Height); Point pt3 = new Point(this.Width, this.Height); path.AddPolygon(new Point[] {pt1, pt2, pt3}); break; } this.Region = new Region(path); } protected override void OnResize(System.EventArgs e) { base.OnResize(e); RefreshPath(); this.Invalidate(); } protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { base.OnPaint(e); if (path != null) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.FillPath(new SolidBrush(this.BackColor), path); e.Graphics.DrawPath(new Pen(this.ForeColor, 4), path); } } } </source>
Drawing Squares
<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.Data; namespace DrawingSquares {
/// <summary> /// Summary description for DrawingSquares. /// </summary> public class DrawingSquares : System.Windows.Forms.Form { internal System.Windows.Forms.ContextMenu mnuForm; internal System.Windows.Forms.MenuItem mnuNewSquare; internal System.Windows.Forms.ContextMenu mnuLabel; internal System.Windows.Forms.MenuItem mnuColorChange; /// <summary> /// Required designer variable. /// </summary> private System.ruponentModel.Container components = null; public DrawingSquares() { // // 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() { this.mnuForm = new System.Windows.Forms.ContextMenu(); this.mnuNewSquare = new System.Windows.Forms.MenuItem(); this.mnuLabel = new System.Windows.Forms.ContextMenu(); this.mnuColorChange = new System.Windows.Forms.MenuItem(); // // mnuForm // this.mnuForm.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.mnuNewSquare}); // // mnuNewSquare // this.mnuNewSquare.Index = 0; this.mnuNewSquare.Text = "Create New Square"; this.mnuNewSquare.Click += new System.EventHandler(this.mnuNewSquare_Click); // // mnuLabel // this.mnuLabel.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.mnuColorChange}); // // mnuColorChange // this.mnuColorChange.Index = 0; this.mnuColorChange.Text = "Change Color"; this.mnuColorChange.Click += new System.EventHandler(this.mnuColorChange_Click); // // DrawingSquares // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(628, 426); this.ContextMenu = this.mnuForm; this.Name = "DrawingSquares"; this.Text = "DrawingSquares"; this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DrawingSquares_MouseDown); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new DrawingSquares()); } private void mnuNewSquare_Click(object sender, System.EventArgs e) { // Create and configure the "square". Label newLabel = new Label(); newLabel.Size = new Size(40, 40); newLabel.BorderStyle = BorderStyle.FixedSingle; // To determine where to place the label, you need to convert the // current screen-based mouse coordinates into relative form coordinates. newLabel.Location = this.PointToClient(Control.MousePosition); // Attach a context menu to the label. newLabel.ContextMenu = mnuLabel; // Connect the label to all its event handlers. newLabel.MouseDown += new MouseEventHandler(lbl_MouseDown); newLabel.MouseMove += new MouseEventHandler(lbl_MouseMove); newLabel.MouseUp += new MouseEventHandler(lbl_MouseUp); // Add the label to the form. this.Controls.Add(newLabel); }
// Keep track of when fake drag or resize mode is enabled. private bool isDragging = false; private bool isResizing = false; // Store the location where the user clicked on the control. private int clickOffsetX, clickOffsetY; private void lbl_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { // Retrieve a reference to the active label. Control currentCtrl; currentCtrl = (Control)sender; if (e.Button == MouseButtons.Right) { // Show the context menu. currentCtrl.ContextMenu.Show(currentCtrl, new Point(e.X, e.Y)); } else if (e.Button == MouseButtons.Left) { clickOffsetX = e.X; clickOffsetY = e.Y; if ((e.X + 5) > currentCtrl.Width && (e.Y + 5) > currentCtrl.Height) { // The mouse pointer is in the bottom right corner, // so resizing mode is appropriate. isResizing = true; } else { // The mouse is somewhere else, so dragging mode is // appropriate. isDragging = true; } } } private void lbl_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { // Retrieve a reference to the active label. Control currentCtrl; currentCtrl = (Control)sender; if (isDragging) { // Move the control. currentCtrl.Left += e.X - clickOffsetX; currentCtrl.Top += e.Y - clickOffsetY; } else if (isResizing) { // Resize the control. currentCtrl.Width = e.X; currentCtrl.Height = e.Y; } else { // Change the pointer if the mouse is in the bottom corner. if ((e.X + 5) > currentCtrl.Width && (e.Y + 5) > currentCtrl.Height) { currentCtrl.Cursor = Cursors.SizeNWSE; } else { currentCtrl.Cursor = Cursors.Arrow; } } } private void lbl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { isDragging = false; isResizing = false; } private void mnuColorChange_Click(object sender, System.EventArgs e) { // Show color dialog. ColorDialog dlgColor = new ColorDialog(); dlgColor.ShowDialog(); // Change label background. mnuLabel.SourceControl.BackColor = dlgColor.Color; } private void DrawingSquares_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Right) { this.ContextMenu.Show(this, new Point(e.X, e.Y)); } } }
}
</source>
Mouse click action and draw circle
<source lang="csharp">
using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; public class MainForm : System.Windows.Forms.Form { private System.ruponentModel.Container components; private ArrayList myPts = new ArrayList(); public MainForm() { InitializeComponent(); CenterToScreen(); this.Text = "click on me"; } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } private void InitializeComponent() { this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 273); this.Text = "Form1"; this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseDown); this.Paint += new System.Windows.Forms.PaintEventHandler(this.MainForm_Paint); } static void Main() { Application.Run(new MainForm()); } private void MainForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { Graphics g = Graphics.FromHwnd(this.Handle); // Add to points collection. myPts.Add(new Point(e.X, e.Y)); Invalidate(); } private void MainForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; foreach(Point p in myPts) g.DrawEllipse(new Pen(Color.Green), p.X, p.Y, 10, 10); } } </source>
Using the mouse to draw on a form
<source lang="csharp">
using System; using System.Drawing; using System.ruponentModel; using System.Windows.Forms; public class Painter : System.Windows.Forms.Form { bool shouldPaint = false; public Painter() { this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(400, 400); this.MouseDown +=new System.Windows.Forms.MouseEventHandler(this.Painter_MouseDown ); this.MouseUp +=new System.Windows.Forms.MouseEventHandler(this.Painter_MouseUp ); this.MouseMove +=new System.Windows.Forms.MouseEventHandler(this.Painter_MouseMove ); } [STAThread] static void Main() { Application.Run( new Painter() ); } private void Painter_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e ) { shouldPaint = true; } private void Painter_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e ) { shouldPaint = false; } protected void Painter_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e ) { if ( shouldPaint ) { Graphics graphics = CreateGraphics(); graphics.FillEllipse(new SolidBrush( Color.Black ),e.X, e.Y, 10, 10 ); } } } </source>