2011-08-24 16 views
5

मैं माउस की घटनाओं के साथ picturebox पर आयत बनाकर हूँ:पिक्चरबॉक्स पर ड्राइंग आयताकार - आयताकार क्षेत्र को कैसे सीमित करें?

private void StreamingWindow_MouseDown(object sender, MouseEventArgs e) 
    { 
       rect = new Rectangle(e.X, e.Y, 0, 0); 
       this.Invalidate();  
    } 

    private void StreamingWindow_Paint(object sender, PaintEventArgs e) 
    { 

     if (painting == true) 
     { 

      using (Pen pen = new Pen(Color.Red, 2)) 
      { 
       e.Graphics.DrawRectangle(pen, rect); 
      } 
     } 
    } 

    private void StreamingWindow_MouseMove(object sender, MouseEventArgs e) 
    {  
      if (e.Button == MouseButtons.Left) 
      { 
       // Draws the rectangle as the mouse moves 
       rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top); 
      } 
      this.Invalidate();  
    } 

आयत मैं इसके अंदर कब्जा कर सकते हैं और जेपीजी के रूप में बचाने के बनाने के बाद।

मेरी समस्या क्या है?

मैं retangle आकर्षित कर सकते हैं जो सीमाओं picturebox के बाहर के क्षेत्र हैं:

enter image description here

मैं कैसे आयत का क्षेत्रफल कि picturebox की सीमा अधिकतम अनुमति दी है आयत के स्थान सीमित कर सकते हैं?

मेरी अंग्रेजी के लिए क्षमा करें, मैं आशा है कि आप मेरी समस्या :) समझ जाएंगे कि तो मैं कुछ इस तरह करना चाहते हैं जिसके परिणामस्वरूप:

enter image description here

उत्तर

2
private void StreamingWindow_MouseMove(object sender, MouseEventArgs e) 
{  
    if (e.Button == MouseButtons.Left) 
    { 
    // Draws the rectangle as the mouse moves 
    rect = new Rectangle(rect.Left, rect.Top, Math.Min(e.X - rect.Left, pictureBox1.ClientRectangle.Width - rect.Left), Math.Min(e.Y - rect.Top, pictureBox1.ClientRectangle.Height - rect.Top)); 
    } 
    this.Invalidate();  
} 
+0

देखें मैंने सोचा कि यह अधिक जटिल होगा;) – Elfoc

0

मैं सबसे आसान तरीका है कहेंगे इसे प्राप्त करने के लिए, और मैं व्यक्तिगत रूप से UX परिप्रेक्ष्य से अधिक प्राकृतिक सोचता हूं, यह है: MouseUp के बाद जांच करें कि BottomLeft आयत के कोने को चित्र बॉक्स के क्षेत्र के बाहर है, यदि ऐसा है, तो बस इसे "वापस" लाएं और इसे चित्र बॉक्स के कोण पर संरेखित करें जैसे आपने खींचा था।

संपादित

बस आपको एक विचार के बारे में मैं क्या बात कर रहा हूँ देने के लिए, एक स्यूडोकोड

private void StreamingWindow_MouseUp(object sender, MouseEventArgs e) 
    { 
       if(rect.Right > myPictureBox.ClientRectangle.Right) 
       { 
       rect.Width = myPictureBox.Right - rect.Left - someoffset;      
       }  
       if(rect.Bottom > myPictureBox.ClientRectangle.Bottom) 
       { 
       rect.Height= myPictureBox.Bottom - rect.Top - someoffset;      
       }  
    } 

कुछ इस तरह। लेकिन आपको यह जांचना होगा।

+0

शायद थोड़ा संकेत ऐसा करने के तरीके इस समाधान मिल सकता है? यह http://msdn.microsoft.com/en-us/library/system.windows.rect.bottomleft.aspx से जुड़ा होगा, क्या मैं सही हूँ? – Elfoc

+0

@Elfoc मेरी संपादित पोस्ट – Tigran

0

क्यों कुछ

rect = new Rectangle(min(e.X, pictureBoxX), min(e.Y, pictureBoxY), 0, 0); 

आप स्थान और चित्र बॉक्स की स्थिति के अनुसार pictureX और pictureY गणना करने के लिए जरूरत के लिए रेक्ट coords की स्थापना नहीं।

0

इस रोक रहा है आयत को सुलझाने के लिए एक और तरीका है PictureBox नियंत्रण से बाहर डूब जा करने के लिए

private void StreamingWindow_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      if (e.X < StreamingWindow.Width && Math.Abs(e.Y) < StreamingWindow.Height) 
       // Draws the rectangle as the mouse moves 
       rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y -rect.Top); 
     } 
     this.Invalidate(); 
    } 

किसी ने अधिक उपयोगी

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