2011-08-24 13 views
5

Rysuję prostokąt na PictureBox ze zdarzeń myszy:Rysowanie prostokąta na obrazku - jak ograniczyć obszar prostokąta?

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

Po narysowaniu prostokąta mogę uchwycić jej wnętrzu i zapisać jako jpg.

Jaki jest mój problem?

mogę wyciągnąć retangle których granice są poza obszarem PictureBox:

enter image description here

Jak mogę ograniczyć obszar prostokąta że granica PictureBox jest max dopuszczalne położenie prostokąta?

Przepraszam za mój angielski, mam nadzieję, że zrozumiesz mój problem :) Więc wskutek chciałbym mieć coś takiego:

enter image description here

Odpowiedz

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

Myślałem, że będzie to o wiele bardziej skomplikowane;) – Elfoc

0

powiedziałbym najprostszy sposób aby to osiągnąć, a ja osobiście uważam, że jest bardziej naturalna z perspektywy UX, to: po MouseUp sprawdź, czy kąt prostokąta jest poza obszarem ramki graficznej, jeśli tak, po prostu przynieś go "w tył" i dopasuj do kąta ramki obrazu tak jak narysowałeś.

EDIT

Wystarczy dać wyobrażenie tego, co mówię, o pseudokod

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

Coś takiego. Ale musisz to sprawdzić.

+0

Może mała podpowiedź jak to zrobić? Będzie on połączony z http://msdn.microsoft.com/en-us/library/system.windows.rect.bottomleft.aspx, czy mam rację? – Elfoc

+0

@Elfoc zobacz mój zredagowany wpis – Tigran

0

Dlaczego nie ustawienie coords rect do czegoś

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

trzeba obliczyć pictureX i pictureY w zależności od lokalizacji i położenia okna obrazu.

0

Innym sposobem rozwiązania tego uniemożliwia prostokąt należy utopić poza kontrolą 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(); 
    } 

Ktoś może znaleźć to rozwiązanie bardziej użyteczną

Powiązane problemy