2011-12-26 59 views
5

tôi đã viết mã này:Di chuyển hình chữ nhật với chuột

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

Rectangle di chuyển, nhưng với đảo ngược (nó không nên). Bạn có thể giúp?

+0

Bạn không bao giờ cho hình chữ nhật có Chiều rộng hoặc Chiều cao. –

+0

@Hans: Điều này có vẻ chỉ là một đoạn trích. Nếu hình chữ nhật không có chiều rộng và chiều cao ban đầu, OP không thể thấy nó di chuyển (mặc dù không chính xác). :) – Ani

+0

@HansPassant: Chiều rộng và Chiều cao nhất định, nhưng tôi chưa đăng đoạn mã này – Ticksy

Trả lời

5

Toán học trong trình xử lý di chuyển chuột của bạn để di chuyển hình chữ nhật dựa trên chuyển động của chuột dường như khá tắt; Tôi nghĩ rằng bạn muốn một cái gì đó như thế này:

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(); 
    } 
} 

Bằng cách này, góc trên bên trái của hình chữ nhật sẽ đi theo chuột bằng cách theo dõi các đồng bằng giữa ban đầu vị trí chuột xuống và vị trí chuột hiện. Tuy nhiên, lưu ý rằng mỗi khi bạn nhấp lại và kéo, hình chữ nhật sẽ di chuyển trở lại vị trí gốc gốc của nó.

Nếu, thay vào đó, bạn muốn Rectangle để 'nhớ' vị thế của mình trên nhiều hoạt động nhấp và kéo (tức là không được reinitialized đến vị trí ban đầu của nó trên chuột xuống), bạn có thể làm:

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(); 
    } 
} 

Một đề xuất khác: Không cần tạo loại MovePoint của riêng bạn khi đã có loại System.Drawing.Point. Ngoài ra, nói chung, hãy thử không tạo các cấu trúc có thể thay đổi được.

+0

Cảm ơn bạn rất nhiều! Đặc biệt là trong phần thứ hai của câu trả lời (suy nghĩ làm thế nào để sửa lỗi này với vị trí thiết lập lại). – Ticksy

Các vấn đề liên quan