using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; //This code is based on: http://support.microsoft.com/kb/314945 namespace RBRectangle { public partial class Form1 : Form { bool bHaveMouse = false; Point ptOriginal = new Point(); Point ptLast = new Point(); List rectList = new List(); public Form1() { InitializeComponent(); } private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { // Make a note that we "have the mouse". bHaveMouse = true; // Store the "starting point" for this rubber-band rectangle. ptOriginal.X = e.X; ptOriginal.Y = e.Y; // Special value lets us know that no previous // rectangle needs to be erased. ptLast.X = -1; ptLast.Y = -1; } else if (e.Button == MouseButtons.Right) { Rectangle rectToRemove = new Rectangle(); bool hitTest = false; foreach (Rectangle r in rectList) { if (r.Contains(e.X, e.Y)) { if (MessageBox.Show("Delete this rectangle?", "Right click in rectangle", MessageBoxButtons.YesNo) == DialogResult.Yes) { rectToRemove = r; hitTest = true; break; } } } if (hitTest) { rectList.Remove(rectToRemove); Invalidate(); Update(); } } } private void Form1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) return; // Set internal flag to know we no longer "have the mouse". bHaveMouse = false; // If we have drawn previously, draw again in that spot // to remove the lines. if( ptLast.X != -1 ) { Rectangle r = MakeRectangle(ptOriginal, ptLast); MyDrawReversibleRectangle(r); MyDrawRealRectangle(r); rectList.Insert(0, r); } // Set flags to know that there is no "previous" line to reverse. ptLast.X = -1; ptLast.Y = -1; ptOriginal.X = -1; ptOriginal.Y = -1; } private void Form1_MouseMove(object sender, MouseEventArgs e) { Point ptCurrent = new Point( e.X, e.Y ); // If we "have the mouse", then we draw our lines. if( bHaveMouse ) { // If we have drawn previously, draw again in // that spot to remove the lines. if( ptLast.X != -1 ) { MyDrawReversibleRectangle( MakeRectangle(ptOriginal, ptLast) ); } // Update last point. ptLast = ptCurrent; // Draw new lines. MyDrawReversibleRectangle( MakeRectangle(ptOriginal, ptCurrent) ); } } // Convert and normalize the points and draw the reversible frame. private void MyDrawReversibleRectangle(Rectangle r) { // Draw the reversible frame. ControlPaint.DrawReversibleFrame( RectangleToScreen(r), Color.Red, FrameStyle.Thick ); } private void MyDrawRealRectangle( Rectangle r ) { // Draw the rectangle. Graphics g = CreateGraphics(); Pen p = new Pen(Color.Red, 3); g.DrawRectangle(p, r); p.Dispose(); g.Dispose(); } private Rectangle MakeRectangle( Point p1, Point p2 ) { Rectangle rc = new Rectangle(); // Normalize the rectangle. if( p1.X < p2.X ) { rc.X = p1.X; rc.Width = p2.X - p1.X; } else { rc.X = p2.X; rc.Width = p1.X - p2.X; } if( p1.Y < p2.Y ) { rc.Y = p1.Y; rc.Height = p2.Y - p1.Y; } else { rc.Y = p2.Y; rc.Height = p1.Y - p2.Y; } return rc; } private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; foreach(Rectangle r in rectList) { MyDrawRealRectangle(r); } } } }