/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ // Rect.cs - Demonstrates the use of properties to control how values are // saved in fields // // This is a Visual Studio project. To compile outside of Visual // Studio, use the following command line: // C:>csc rect.cs // using System; using System.Drawing; namespace nsRect { struct POINT { public POINT (int x, int y) { this.cx = x; this.cy = y; } public int cx; public int cy; public override string ToString () { return (String.Format ("({0}, {1})", cx, cy)); } } struct RECT { public RECT (Rectangle rc) { m_UpperLeft.cx = rc.X; m_UpperLeft.cy = rc.Y; m_LowerRight.cx = rc.X + rc.Width; m_LowerRight.cy = rc.Y + rc.Height; } // Define constructors public RECT (POINT pt1, POINT pt2) { m_UpperLeft = pt1; m_LowerRight = pt2; } public RECT (int x1, int y1, int x2, int y2) { m_UpperLeft.cx = x1; m_UpperLeft.cy = y1; m_LowerRight.cx = x2; m_LowerRight.cy = y2; } public RECT (POINT pt1, int Width, int Height) { m_UpperLeft.cx = pt1.cx; m_UpperLeft.cy = pt1.cy; m_LowerRight.cx = pt1.cx + Width; m_LowerRight.cy = pt1.cy + Height; } // Property to get and set the upper left point public POINT UpperLeft { get {return (m_UpperLeft);} set {m_UpperLeft = value;} } // Property to get and set the lower right point public POINT LowerRight { get {return (m_LowerRight);} set {m_LowerRight = value;} } // Property to return a normalized System.Drawing.ectangle object public System.Drawing.Rectangle Rectangle { get { RECT rc = Normal; return (new Rectangle (rc.UpperLeft.cx, rc.UpperLeft.cy, rc.LowerRight.cx - rc.UpperLeft.cx, rc.LowerRight.cy - rc.UpperLeft.cy)); } } // Property to return a normalized copy of this rectangle public RECT Normal { get { return (new RECT ( Math.Min (m_LowerRight.cx, m_UpperLeft.cx), Math.Min (m_LowerRight.cy, m_UpperLeft.cy), Math.Max (m_LowerRight.cx, m_UpperLeft.cx), Math.Max (m_LowerRight.cy, m_UpperLeft.cy)) ); } } private POINT m_UpperLeft; private POINT m_LowerRight; public override string ToString() { return (String.Format ("Upper left = {0}; Lower right = {1}", m_UpperLeft, m_LowerRight)); } } public class Rect { static public void Main () { // Define a "normal" rectangle POINT pt1 = new POINT (-10,30); POINT pt2 = new POINT (100, 100); RECT rc = new RECT (pt1, pt2); Console.WriteLine ("RECT: " + rc); Console.WriteLine ("Normal: " + rc.Normal); Console.WriteLine ("Rectangle: " + rc.Rectangle + " "); // Define a rectangle with normal x but not y pt1.cx = 100; pt1.cy = 50; pt2.cx = 200; pt2.cy = 20; rc.UpperLeft = pt1; rc.LowerRight = pt2; Console.WriteLine ("RECT: " + rc); Console.WriteLine ("Normal: " + rc.Normal); Console.WriteLine ("Rectangle: " + rc.Rectangle + " "); // Define a rectangle with normal y but not x pt1.cx = 200; pt1.cy = 50; pt2.cx = 100; pt2.cy = 80; rc.UpperLeft = pt1; rc.LowerRight = pt2; Console.WriteLine ("RECT: " + rc); Console.WriteLine ("Normal: " + rc.Normal); Console.WriteLine ("Rectangle: " + rc.Rectangle + " "); // Define a rectangle with both values of upper left greater than the lower y pt1.cx = 225; pt1.cy = 180; pt2.cx = 25; pt2.cy = 35; rc.UpperLeft = pt1; rc.LowerRight = pt2; Console.WriteLine ("RECT: " + rc); Console.WriteLine ("Normal: " + rc.Normal); Console.WriteLine ("Rectangle: " + rc.Rectangle + " "); // Define a rectangle with points equal pt1.cx = 75; pt1.cy = 150; pt2.cx = 75; pt2.cy = 150; rc.UpperLeft = pt1; rc.LowerRight = pt2; Console.WriteLine ("RECT: " + rc); Console.WriteLine ("Normal: " + rc.Normal); Console.WriteLine ("Rectangle: " + rc.Rectangle + " "); } } }