2011-08-24 18 views
5

estoy dibujando rectángulo en PictureBox con eventos de ratón:Rectángulo de dibujo en cuadro de imagen: cómo limitar el área del rectángulo?

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

Después de dibujar el rectángulo que puedo capturar dentro de ella, y guardar como jpg.

¿Cuál es mi problema?

puedo dibujar retangle el que las fronteras son área fuera de cuadro de imagen:

enter image description here

¿Cómo se puede prevenir área del rectángulo esa frontera del cuadro de imagen es Max ubicación del rectángulo permitido?

Lo siento por mi Inglés, espero que usted entienda mi problema :) Así, como resultado me gustaría tener algo como esto:

enter image description here

Respuesta

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

Pensé que sería mucho más complicado;) – Elfoc

0

Yo diría que la manera más fácil para lograr esto, y personalmente creo que es más natural desde la perspectiva UX, es: después de MouseUp comprobar si BottomLeft esquina del rectángulo está fuera del área del cuadro de imagen, si es así, simplemente traerlo "atrás" y alinearlo al ángulo del cuadro de imagen del mismo modo que dibujó.

EDITAR

Sólo para dar una idea de lo que estoy hablando, un pseudocódigo

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

Algo como esto. Pero debes verificar esto.

+0

Quizás pequeña pista de cómo hacer esto? Se conectará con http://msdn.microsoft.com/en-us/library/system.windows.rect.bottomleft.aspx, ¿estoy en lo cierto? – Elfoc

+0

@Elfoc ver mi publicación editada – Tigran

0

Por qué no establecer las coordenadas rect a algo

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

Es necesario para calcular pictureX y pictureY de acuerdo a la ubicación y la posición del cuadro de imagen.

0

Otra forma de resolver este rectángulo está impidiendo que se ahogan fuera del control 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(); 
    } 

Alguien puede encontrar esta solución más útil

Cuestiones relacionadas