2D Graphics C#

/*
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.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace DrawingSquares
{
    /// 
    /// Summary description for DrawingSquares.
    /// 

    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;
        /// 
        /// Required designer variable.
        /// 

        private System.ComponentModel.Container components = null;
        public DrawingSquares()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
        /// 
        /// Clean up any resources being used.
        /// 

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        #region Windows Form Designer generated code
        /// 
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// 

        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
        /// 
        /// The main entry point for the application.
        /// 

        [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));
            }
        
        }
    }
}