2011-08-24 26 views
5

i fare olaylarla PictureBox üzerinde dikdörtgen çiziyorum:Resimdeki dikdörtgen çizimi - dikdörtgen alanın nasıl sınırlandırılacağı?

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

dikdörtgen i içini yakalamak ve jpg olarak kaydedebilirsiniz çizdikten sonra.

Sorunum nedir?

hangi sınırlar PictureBox dış alanıdır retangle çıkarabiliriz:

enter image description here

Nasıl PictureBox sınır max dikdörtgenin konumunu izin dikdörtgenin alanını sınırlandırabilir? benim İngiliz

Üzgünüm, ben sorunumu :) anlayacaksınız umut Yani ben böyle bir şey olsun isterim sonucu:

enter image description here

cevap

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

Daha karmaşık olacağını düşündüm;) – Elfoc

0

Ben en kolay yolu söyleyebilirim Bunu başarmak için ve ben şahsen UX perspektifinden daha doğal olanı düşünün: MouseUp'dan sonra BottomLeft köşesinin dikdörtgenin köşeli resim kutusunun dışında olup olmadığını kontrol edin, eğer öyleyse, sadece "geri" getirin ve resim kutusunun açısına hizalayın 'u çektiğiniz gibi.

DÜZENLEME

Sadece sana bahsettiğimi bir fikir vermek için, bir yalancı kod böyle

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

şey. Ama bunu kontrol etmelisin.

+0

Belki küçük bir ipucu daha kullanışlı bu çözüm bulabiliriz PictureBox'ın kontrolü dışında boğmak edilecek? Http://msdn.microsoft.com/en-us/library/system.windows.rect.bottomleft.aspx ile bağlantı kuracak mıyım? – Elfoc

+0

@Elfoc editörlüğümü gör – Tigran

0

Sen resim kutusunun konumu ve konumuna göre pictureX ve pictureY hesaplamak gereken bir şey

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

rect Coords ayar değil neden.

0

bu engelliyor dikdörtgen çözümü için bir başka yolu

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

Biri bunun nasıl

İlgili konular