0

Implementing the example below in c# VS 2013 on windows 8 does not work the rubber rectangle is drawn at the incorrect position, has anyone else come across or provide an alternative that actually works?

The code used is exactly the same as the example but when the rubber band is drawn it is not drawn at the same location that the mouse cursor was pressed down and moved around. I suspect there is a problem with the code but can't spot the issue.

MyDrawReversibleRectangle, does not draw the rubber band at the correct location.

http://support.microsoft.com/kb/314945

Boolean bHaveMouse;
Point   ptOriginal = new Point();
Point   ptLast = new Point();

// Called when the left mouse button is pressed. 
public void MyMouseDown( Object sender, MouseEventArgs e )
{
   // 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;
}
// Convert and normalize the points and draw the reversible frame.
private void MyDrawReversibleRectangle( Point p1, Point p2 )
{
    Rectangle rc = new Rectangle();

   // Convert the points to screen coordinates.
    p1 = PointToScreen( p1 );
    p2 = PointToScreen( p2 );
    // 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;
    }
    // Draw the reversible frame.
    ControlPaint.DrawReversibleFrame( rc, 
                Color.Red, FrameStyle.Dashed );
}
// Called when the left mouse button is released.
public void MyMouseUp( Object sender, MouseEventArgs e )
{
   // 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 )
   {
        Point ptCurrent = new Point( e.X, e.Y );
        MyDrawReversibleRectangle( ptOriginal, ptLast );
   }
   // Set flags to know that there is no "previous" line to reverse.
   ptLast.X = -1;
   ptLast.Y = -1;
   ptOriginal.X = -1;
   ptOriginal.Y = -1;
}
// Called when the mouse is moved.
public void MyMouseMove( 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( ptOriginal, ptLast );
       }
       // Update last point.
       ptLast = ptCurrent;
       // Draw new lines.
       MyDrawReversibleRectangle( ptOriginal, ptCurrent );
   }
}

// Set up delegates for mouse events.
protected override void OnLoad(System.EventArgs e)
{
   MouseDown += new MouseEventHandler( MyMouseDown );
   MouseUp += new MouseEventHandler( MyMouseUp );
   MouseMove += new MouseEventHandler( MyMouseMove );
   bHaveMouse = false;
}
John Fleming
  • 267
  • 1
  • 3
  • 12
  • 5
    This is a link-only question, which are generally frowned upon. It would help to include the actual code from the example you referenced, and show us specifically what doesn't work and *how* it doesn't work. – Matthew Haugen Nov 07 '14 at 02:13
  • Actually, that's a less-than-compelling example anyway. It's better to just draw the selection rectangle in the `Paint` event handler (or `OnPaint()` method override). In most cases, the naïve "draw everything" approach will be plenty fast. – Peter Duniho Nov 07 '14 at 03:14
  • Can't duplicate the problem. The rectangle is drawing exactly where the mouse is. – LarsTech Nov 07 '14 at 13:26
  • Thanks for trying, something strange happening on my machine! – John Fleming Nov 07 '14 at 19:34

0 Answers0