2011-12-26 16 views
5

साथ आयत ले जाएँ मैं इस कोड लिखा है:माउस

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

आयत चलता है, लेकिन उलट साथ (यह नहीं होना चाहिए)। क्या आप मदद कर सकते हैं?

+0

आप कभी भी आयत को चौड़ाई या ऊंचाई नहीं देते हैं। –

+0

@ हंस: यह केवल एक स्निपेट दिखता है। अगर आयताकार की प्रारंभिक चौड़ाई और ऊंचाई नहीं थी, तो ओपी इसे आगे नहीं देख सका (हालांकि गलत तरीके से)। :) – Ani

+0

@ हंसपैसेंट: चौड़ाई और ऊंचाई दी गई, लेकिन मैंने कोड के इस टुकड़े को पोस्ट नहीं किया है – Ticksy

उत्तर

5

माउस-मूवमेंट्स के आधार पर आयताकार को स्थानांतरित करने के लिए आपके माउस-चाल हैंडलर में गणित काफी दूर लगता है; मुझे लगता है कि आप कुछ इस तरह हैं:

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

इस तरह, आयत के ऊपरी बाएँ कोने प्रारंभिक माउस से नीचे स्थान और वर्तमान माउस स्थान के बीच का अंतर नज़र रखने के द्वारा माउस का पालन करेंगे। ध्यान दें कि प्रत्येक बार जब आप फिर से क्लिक करते हैं और खींचते हैं, तो आयताकार मूल स्थान पर वापस जायेगा।

, तो इसके बजाय, आप आयत चाहते एकाधिक क्लिक करें और खींचें आपरेशन भर में अपनी स्थिति (यानी माउस-डाउन पर अपनी प्रारंभिक स्थान पर इसे पुनः शुरू करना के लिए नहीं) 'याद' करने के लिए आप कर सकते हैं:

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

एक अन्य सुझाव: MovePoint टाइप करने की कोई आवश्यकता नहीं है जब पहले से ही System.Drawing.Point प्रकार हो। इसके अलावा, सामान्य रूप से, mutable structs बनाने की कोशिश नहीं करें।

+0

बहुत बहुत धन्यवाद! विशेष रूप से उत्तर के दूसरे भाग में (सोचा कि रीसेट स्थिति के साथ इस बग को कैसे ठीक किया जाए)। – Ticksy

संबंधित मुद्दे