Простое панорамирование PictureBox (Winforms) - PullRequest
0 голосов
/ 24 января 2012

Я хочу реализовать панорамирование PictureBox в C # winforms. У меня есть панель, на которой для свойства autoScroll установлено значение true. Внутри панели у меня есть pictureBox, для которого sizeMode установлен в autoSize. На картинке я слушаю события мыши, вот так:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        dragging = true;
        start = new Point(e.Location.X + pictureBox1.Location.X, e.Location.Y + pictureBox1.Location.Y);
    }
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Debug.WriteLine("mousemove X: " + e.X + " Y: " + e.Y);

        pictureBox1.Location = new Point(start.X - e.Location.X, start.Y - e.Location.Y);
        this.Refresh();
    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    Debug.WriteLine("mouseup");

    dragging = false;
}

Проблема в том, что после того, как я отпущу кнопку, что-то продолжает вызывать события mouseMove, и изображение очень медленно панорамируется гораздо больше, чем должно быть. Если я перетаскиваю изображение на несколько пикселей (возможно, на 2 или 3), то после отпускания кнопки изображение панорамируется в течение нескольких секунд, и получается:

перемещение мыши X: 66 Y: 37 перемещение мыши X: 66 Y: 38 перемещение мыши X: 66 Y: 39 перемещение мыши X: 66 Y: 40 перемещение мыши X: 66 Y: 41 перемещение мыши X: 66 Y: 42 перемещение мыши X: 66 Y: 43 перемещение мыши X: 66 Y: 44 перемещение мыши X: 66 Y: 45 перемещение мыши X: 66 Y: 46

a.s.o ....

1 Ответ

3 голосов
/ 24 января 2012

Трудно догадаться.Однако ваша обработка координат мыши неверна, она быстро отправит PB в дальний угол.И не вызывайте метод Refresh () формы, нет смысла перерисовывать его.Исправить:

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            dragging = true;
            start = e.Location;
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
        if (dragging) {
            Debug.WriteLine("mousemove X: " + e.X + " Y: " + e.Y);

            pictureBox1.Location = new Point(pictureBox1.Left + e.Location.X - start.X,
                pictureBox1.Top + e.Location.Y - start.Y);
        }
    }
...