Mega Code Archive

 
Categories / C# / 2D Graphics
 

Drawing Shapes

/* 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.ComponentModel; 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.ComponentModel.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);             }         }     }