0

在 Windows 8 上的 c# VS 2013 中实现下面的示例不起作用,橡胶矩形绘制在不正确的位置,是否有其他人遇到或提供实际可行的替代方案?

使用的代码与示例完全相同,但是当绘制橡皮筋时,它不会在鼠标光标被按下和移动的相同位置绘制。我怀疑代码有问题,但无法发现问题。

MyDrawReversibleRectangle,没有在正确的位置绘制橡皮筋。

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;
}
4

0 回答 0