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