2D Graphics C#

/*
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.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace AllCornerRect
{
    public class AllCornerRect : System.Windows.Forms.Form
    {
    #region Class Local Variables
    RealRect MyRect;
    #endregion
    private System.ComponentModel.Container components = null;
    public AllCornerRect() {
        InitializeComponent();
        this.SetStyle( ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle( ControlStyles.DoubleBuffer, true);
        this.MouseDown  += new MouseEventHandler(this.M_down);
        this.MouseUp    += new MouseEventHandler(this.M_up);
        this.MouseMove  += new MouseEventHandler(this.M_move);
        MyRect = new RealRect();
    }
    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()
        {
      // 
      // AllCornerRect
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(320, 301);
      this.MaximizeBox = false;
      this.MinimizeBox = false;
      this.Name = "AllCornerRect";
      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
      this.Text = "AllCornerRect";
      this.Load += new System.EventHandler(this.AllCornerRect_Load);
    }
        #endregion
        [STAThread]
        static void Main() 
        {
            Application.Run(new AllCornerRect());
        }
    private void AllCornerRect_Load(object sender, System.EventArgs e)
    {
    }
    protected override void OnPaint(PaintEventArgs e)
    {
      base.OnPaint(e);
      Graphics G = e.Graphics;
      G.DrawRectangle(Pens.Red, MyRect.Rect);
    }
    #region Squeek
    private void M_up(object sender, MouseEventArgs e)
    {
      Invalidate();
    }
    private void M_down(object sender, MouseEventArgs e)
    {
      if (e.Button != MouseButtons.Left)
        return;
      MyRect = new RealRect(e.X, e.Y);
    }
    private void M_move(object sender, MouseEventArgs e)
    {
      if (e.Button != MouseButtons.Left)
        return;
      MyRect.EndX = e.X;
      MyRect.EndY = e.Y;
      Invalidate();
    }
    #endregion
    }
    public class RealRect
    {
    #region Class Local Variables
    private Point mStart;
    private Point mEnd;
    private Point mRealStart;
    private Point mRealEnd;
    private Size  mRealSize;
    private Rectangle mRect;
    #endregion
    public RealRect(int X, int Y)
        {
      mStart        = Point.Empty;
      mEnd          = Point.Empty;
      mRealStart    = Point.Empty;
      mRealEnd      = Point.Empty;
      mRealSize     = Size.Empty;
      mStart.X      = X;
      mStart.Y      = Y;
      mRealStart.X  = X;
      mRealStart.Y  = Y;
      mRect = Rectangle.Empty;
    }
    public RealRect()
    {
      mStart        = Point.Empty;
      mEnd          = Point.Empty;
      mRealStart    = Point.Empty;
      mRealEnd      = Point.Empty;
      mRealSize     = Size.Empty;
      mStart.X      = 0;
      mStart.Y      = 0;
      mRealStart.X  = 0;
      mRealStart.Y  = 0;
      mRect = Rectangle.Empty;
    }
    /// 
    /// Ending X Value of rectangle
    /// 

    public int EndX
    {
      set{ mEnd.X = value; }
    }
    /// 
    /// Ending Y Value of rectangle
    /// 

    public int EndY
    {
      set{ mEnd.Y = value; }
    }
    /// 
    /// Get the corrected rectangle
    /// 

    public Rectangle Rect
    {
      get
      { 
        MakeReal();
        mRect.Location = mRealStart;
        mRect.Size = mRealSize;
        return mRect; 
      }
    }
    private void MakeReal()
    {
      //Started top left, ended bottom right
      if (mEnd.X > mStart.X && mEnd.Y > mStart.Y)
      {
        mRealStart = mStart;
        mRealEnd = mEnd;
        mRealSize = new Size(mRealEnd.X-mRealStart.X, mRealEnd.Y-mRealStart.Y);
        return;
      }
      //Started bottom right, ended top left
      if (mEnd.X < mStart.X && mEnd.Y < mStart.Y)
      {
        mRealEnd = mStart;
        mRealStart = mEnd;
        mRealSize = new Size(mRealEnd.X-mRealStart.X, mRealEnd.Y-mRealStart.Y);
        return;
      }
      //Started top right left, ended bottom left
      if (mEnd.X < mStart.X && mEnd.Y > mStart.Y)
      {
        mRealStart.X = mEnd.X;
        mRealStart.Y = mStart.Y;
        mRealEnd.X   = mStart.X;
        mRealEnd.Y   = mEnd.Y;
        mRealSize = new Size(mRealEnd.X-mRealStart.X, mRealEnd.Y-mRealStart.Y);
        return;
      }
      //Started bottom left, ended top right
      if (mEnd.X > mStart.X && mEnd.Y < mStart.Y)
      {
        mRealStart.X = mStart.X;
        mRealStart.Y = mEnd.Y;
        mRealEnd.X   = mEnd.X;
        mRealEnd.Y   = mStart.Y;
        mRealSize = new Size(mRealEnd.X-mRealStart.X, mRealEnd.Y-mRealStart.Y);
        return;
      }
    }
  }
}