2009-11-26 14 views
6

Tengo un cuadro de imagen configurado en Tamaño automático para que la imagen lo obligue a crecer al tamaño completo de la imagen.¿Cómo puedo hacer que un panel se mueva programáticamente para exponer su cuadro de imagen de tamaño automático?

El cuadro de imagen está en un panel con autoScroll = true, de modo que las barras de desplazamiento aparecen cuando la imagen es más grande que el panel.

¿Cómo puedo desplazar el panel mediante programación a medida que el usuario hace clic en los arrastres de la imagen, reposicionando así la imagen.

He intentado usar el evento MouseMove, capturar las últimas posiciones X e Y del mouse, calcular cuánto se movió el mouse y ajustar los valores de desplazamiento vertical y horizontal del panel.

Lo hace mover la imagen, pero salta por todos lados y se desplaza de manera impredecible.

¿Cómo puedo lograrlo?

Esto es lo que tengo en mis eventos del ratón ...

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (dragging) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      // move the image inverse to direction dragged 
      int horizontalChange = (e.X - startingX) * -1; 
      int newHorizontalPos = panel1.HorizontalScroll.Value + horizontalChange; 

      if (newHorizontalPos < panel1.HorizontalScroll.Minimum) 
      { 
       newHorizontalPos = panel1.HorizontalScroll.Minimum; 
       horizontalChange = 0; 
      } 

      if (newHorizontalPos > panel1.HorizontalScroll.Maximum) 
      { 
       newHorizontalPos = panel1.HorizontalScroll.Maximum; 
       horizontalChange = 0; 
      } 

      panel1.HorizontalScroll.Value = newHorizontalPos; 

      int verticalChange = (e.Y - startingY); 
      // move the image inverse to direction dragged 
      int newverticalPos = panel1.VerticalScroll.Value + verticalChange * -1; 

      if (newverticalPos < panel1.VerticalScroll.Minimum) 
      { 
       newverticalPos = panel1.VerticalScroll.Minimum; 
       verticalChange = 0; 
      } 

      if (newverticalPos > panel1.VerticalScroll.Maximum) 
      { 
       newverticalPos = panel1.VerticalScroll.Maximum; 
       verticalChange = 0; 
      } 

      panel1.VerticalScroll.Value = newverticalPos; 
     } 
    } 

    startingX = e.X; 
    startingY = e.Y; 
} 

Es mi lógica equivocada o es mi comprensión de la funcionalidad de desplazamiento del panel de mal?

Respuesta

4

Creo que su instinto es correcto, pero su error es intentar ajustar las barras de desplazamiento en lugar de mover el PictureBox dentro del panel desplazable.

Debe interceptar el MouseMove y ajustar la propiedad Ubicación del PictureBox mediante el delta de movimiento del mouse; las barras de desplazamiento deberían actualizarse automáticamente para reflejar la nueva ubicación de la imagen dentro de él.

La actualización de su código sería algo como Tho siguiente (no probado):

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (dragging) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      int horizontalChange = (e.X - startingX) * -1; // move the image inverse to direction dragged 

      int verticalChange = (e.Y - startingY); 

      pictureBox1.Left += horizontalChange; 
      pictureBox1.Top += verticalChange; 
     } 
    } 

    startingX = e.X; 
    startingY = e.Y; 
} 

(También, me inclinaría a grabar el ratón de partida y lugares PictureBox en el inicio de la resistencia y actualizarlos en relación con esta posición de inicio en cada evento MouseMove en lugar de realizar cambios incrementales como el código anterior (y su código original). La razón de esto es que si hay valores inesperados, por la razón que sea, esto solo causará un efecto transitorio. el próximo evento bueno se autocorregirá.)

+0

Gracias. Estoy trabajando con este enfoque. El control del panel no muestra las barras de desplazamiento si mueve el cuadro de imagen fuera de los lados superior o izquierdo :-( –

+0

Oh, eso es extraño, realmente debería hacerlo si tiene activado AutoScroll. –

5

Está saltando porque el acto o Si se desplaza el panel, se desplazará la posición del mouse por la cantidad de desplazamiento. Usted puede obtener la posición "real" del ratón (en relación a la esquina superior izquierda del panel) así:

Point realPos = new Point(e.X + panel1.AutoScrollPosition.X, 
    e.Y + panel1.AutoScrollPosition.Y); 

asumiendo el cuadro de imagen' Localización propiedad es (0, 0). La mejor manera de desplazarse por el panel es establecer su propiedad AutoScrollPosition.

2

Puede configurar el panel AutoScrollPosition en el evento MouseMove. Probado y funciona bien.

panel1.AutoScrollPosition = new Point(-panel1.AutoScrollPosition.X - e.X + startPoint.X, -panel1.AutoScrollPosition.Y - e.Y + startPoint.Y); 
Cuestiones relacionadas