¿Cómo puedo hacer que un panel se desplace programáticamente para exponer su cuadro de tamaño automático?

StackOverflow https://stackoverflow.com/questions/1803191

  •  05-07-2019
  •  | 
  •  

Pregunta

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.

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 programáticamente el panel cuando el usuario hace clic en los arrastres de la imagen, y así reposicionar la imagen?

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

Mueve la imagen, pero salta por todo el lugar y se desplaza de forma impredecible.

¿Cómo puedo lograr esto?

Esto es lo que tengo en mis eventos de Mouse ...

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

¿Mi lógica es incorrecta o mi comprensión de la funcionalidad de desplazamiento del panel es incorrecta?

¿Fue útil?

Solución

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 MouseMove y ajustar la propiedad Ubicación de PictureBox mediante el delta de movimiento del mouse & # 8212; las barras de desplazamiento deberían actualizarse automáticamente para reflejar la nueva ubicación de la imagen dentro de ella.

La actualización de su código se vería como la siguiente (sin probar):

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

(Además, me inclinaría por registrar las ubicaciones del mouse inicial y PictureBox al inicio del arrastre y actualizarlas en relación con esta posición inicial 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 cualquier razón, esto solo causará un efecto transitorio & # 8212; el próximo buen evento se autocorregirá.)

Otros consejos

Está saltando porque el acto de desplazar el panel desplazará la posición del mouse por la cantidad de desplazamiento. Puedes obtener el " real " Posición del mouse (relativa a la esquina superior izquierda del panel) de esta manera:

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

suponiendo que el cuadro de imagen 'Propiedad de ubicación es (0, 0). La mejor manera de desplazar el panel es establecer su propiedad AutoScrollPosition.

Puede configurar el AutoScrollPosition del panel 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top