Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > [VC#] PictureBox - прокрутка ихображения мышью


Автор: MuForum 1.9.2008, 23:52
Доброе время суток!
- Использую 'MVS2008', C#, '.NET 2.0'.
- Работаю с компонентом 'PictureBox'.
- Необходимо изменять положение картинки при передвижение мыши.
- То есть, если картинка больше размеров отображения компонента 'PictureBox', то зажав левый клик мыши и изменяя положение мыши относительно системы необходимо перемещать изображение.
- Я вроде сделал это, по почему-то слишком резко перемещается картинка.
- Для прокрутки использовал компоненты:
Код

        private VScrollBar g_vScrollBar;
        private HScrollBar g_hScrollBar;
        private bool _MoveImage = false;
        private Point MovePoint = Point.Empty;
        // ----------------------------------------------------------------------

        private void FMain_Load(object sender, EventArgs e)
        {
            g_hScrollBar = new HScrollBar();
            g_hScrollBar.Visible = false;
            g_hScrollBar.Dock = DockStyle.Bottom;
            g_vScrollBar = new VScrollBar();
            g_vScrollBar.Visible = false;
            g_vScrollBar.Dock = DockStyle.Right;
            // ----
            pb_main.Controls.Add(g_hScrollBar);
            pb_main.Controls.Add(g_vScrollBar);
            // ----
            g_hScrollBar.Scroll += new ScrollEventHandler(g_hScrollBar_Scroll);
            g_vScrollBar.Scroll += new ScrollEventHandler(g_vScrollBar_Scroll);
        }
        // ----------------------------------------------------------------------

        private void pb_main_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                pb_main.Cursor = TCursor.GetCursor("PanToolCursorMouseDown.cur");
                //MovePoint = Cursor.Position;
                MovePoint = e.Location;
                MoveImage = true;
            }
        }
        // ----------------------------------------------------------------------

        private void pb_main_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                MoveImage = false;
                pb_main.Cursor = TCursor.GetCursor("PanToolCursor.cur");
            }
        }
        // ----------------------------------------------------------------------

        private void pb_main_MouseMove(object sender, MouseEventArgs e)
        {
            if (TSaveImage.MoveImage)
            {
                int CorX = ((MovePoint.X - e.X) / 10);
                int CorY = ((MovePoint.Y - e.Y) / 10);
                //int CorX = ((MovePoint.X - Cursor.Position.X) / 10);
                //int CorY = ((MovePoint.Y - Cursor.Position.Y) / 10);
                int CorX2 = g_hScrollBar.Value + CorX;
                int CorY2 = g_vScrollBar.Value + CorY;
                // ----
                if (CorX2 >= 0 && CorX2 <= g_hScrollBar.Maximum) g_hScrollBar.Value += CorX;
                if (CorY2 >= 0 && CorY2 <= g_vScrollBar.Maximum) g_vScrollBar.Value += CorY;
                pb_main.Refresh();
            }
        }
        // ----------------------------------------------------------------------




P.S. -> Прорисовка изображения осуществляется в обработчике 'pb_main_Paint()'
- Что не так парни?
- Смотрел в редактораз 'ACD Photo Editor', 'Paint.NET', там изменения положения мышью делается плавно, а в моём случае очень резко =(


# Добавленo: Вроде с резкостью прокрутки разобрался(поделил изменяемый кофициент на 10), но вот присутствует недочёт, что когда ведёшь в одну сторону, затем начинаешь ввести в другую, изображения почему-то продолжает двигаться в противоположную, пока не отпустишь левый клик и снова не зажмёшь.

Автор: Alekz 2.9.2008, 09:18
Цитата(MuForum @ 1.9.2008,  23:52)
Код

              private void pb_main_MouseMove(object sender, MouseEventArgs e)
        {
            if (TSaveImage.MoveImage)
            {
                int CorX = ((MovePoint.X - e.X) / 10);
                int CorY = ((MovePoint.Y - e.Y) / 10);
                //int CorX = ((MovePoint.X - Cursor.Position.X) / 10);
                //int CorY = ((MovePoint.Y - Cursor.Position.Y) / 10);
                int CorX2 = g_hScrollBar.Value + CorX;
                int CorY2 = g_vScrollBar.Value + CorY;
                // ----
                if (CorX2 >= 0 && CorX2 <= g_hScrollBar.Maximum) g_hScrollBar.Value += CorX;
                if (CorY2 >= 0 && CorY2 <= g_vScrollBar.Maximum) g_vScrollBar.Value += CorY;
                pb_main.Refresh();
            }
        }


...
когда ведёшь в одну сторону, затем начинаешь ввести в другую, изображения почему-то продолжает двигаться в противоположную, пока не отпустишь левый клик и снова не зажмёшь.

Ты все время отсчитываешь перемещение от MovePoint.
Значит после каждого перемещения в обработчике MouseMove MovePoint нужно модифицировать.
Что-то типа 

MovePoint = e.Location;

Автор: MuForum 2.9.2008, 13:35
Цитата(Alekz @ 2.9.2008,  09:18)
Ты все время отсчитываешь перемещение от MovePoint.
Значит после каждого перемещения в обработчике MouseMove MovePoint нужно модифицировать.
Что-то типа 

MovePoint = e.Location;

Точно, ступил малость.
- Исправил и всё работает как надо, благодарю за подсказку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)