2011-12-26 7 views
5

escribí este código:Mueva el rectángulo con el ratón

private struct MovePoint 
    { 
     public int X; 
     public int Y; 
    } 
private void Image_MouseDown(object sender, MouseEventArgs e) 
    { 
     FirstPoint = new MovePoint(); 
     FirstPoint.X = e.X; 
     FirstPoint.Y = e.Y; 
    } 

    private void Image_MouseMove(object sender, MouseEventArgs e) 
    { 
     if(e.Button == MouseButtons.Left) 
     { 
      if(FirstPoint.X > e.X) 
      { 
       Rectangle.X = FirstPoint.X - e.X; 
       //Rectangle.Width -= FirstPoint.X - e.X; 
      } else 
      { 
       Rectangle.X = FirstPoint.X + e.X; 
       //Rectangle.Width += FirstPoint.X + e.X; 
      } 

      if(FirstPoint.Y > e.Y) 
      { 
       Rectangle.Y = FirstPoint.Y - e.Y; 
       //Rectangle.Height -= FirstPoint.Y - e.Y; 
      } else 
      { 
       Rectangle.Y = FirstPoint.Y + e.Y; 
       //Rectangle.Height += FirstPoint.Y + e.Y; 
      } 

      Image.Invalidate(); 
     } 
    } 
private void Image_Paint(object sender, PaintEventArgs e) 
    { 
     if(Pen != null) e.Graphics.DrawRectangle(Pen, Rectangle); 
    } 

rectángulo se mueve, pero con inversión (no debería ser). ¿Puede usted ayudar?

+0

Nunca le da al rectángulo un ancho o alto. –

+0

@Hans: Esto parece ser solo un fragmento. Si el rectángulo no tenía un ancho y una altura iniciales, el OP no podría haberlo visto en movimiento (aunque incorrectamente). :) – Ani

+0

@HansPassant: Ancho y alto dado, pero no he publicado este fragmento de código – Ticksy

Respuesta

5

Las matemáticas en el manejador de movimiento del mouse para mover el rectángulo en función de los movimientos del mouse parecen bastante desajustes; Creo que quieres algo como esto:

private void Image_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     int initialX = 0, initialY = 0; // for example. 

     Rectangle.X = (e.X - FirstPoint.X) + initialX; 
     Rectangle.Y = (e.Y - FirstPoint.Y) + initialY; 

     Image.Invalidate(); 
    } 
} 

De esta manera, en la esquina superior izquierda del rectángulo seguirá el ratón mediante el seguimiento del delta entre el ratón hacia abajo ubicación inicial y la ubicación del ratón actual. Sin embargo, tenga en cuenta que cada vez que vuelva a hacer clic y arrastrar, el rectángulo volverá a su ubicación original .

En cambio, si desea que el rectángulo a 'recordar' su posición a través de múltiples operaciones, haga clic y arrastre (es decir, no asignado el valor en su ubicación inicial en el ratón hacia abajo) que puede hacer:

private void Image_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     // Increment rectangle-location by mouse-location delta. 
     Rectangle.X += e.X - FirstPoint.X; 
     Rectangle.Y += e.Y - FirstPoint.Y; 

     // Re-calibrate on each move operation. 
     FirstPoint = new MovePoint { X = e.X, Y = e.Y }; 

     Image.Invalidate(); 
    } 
} 

Otra sugerencia: no es necesario crear su propio tipo MovePoint cuando ya existe el tipo System.Drawing.Point. Además, en general, intente no crear estructuras mutables.

+0

¡Muchas gracias! Especialmente en la segunda parte de la respuesta (pensé en cómo solucionar este error con la posición de reinicio). – Ticksy

Cuestiones relacionadas