Move image inside a picturebox with the mouse without using the scrollbar

2

Kindly, does anyone know how I can move an image within a pictureBox without having to click the scrollbar ? What I want is to move the image, just clicking the mouse on it so I can drag it inside pictureBox .

This is the Form:

WhenIclickthebutton,itloadsanimageintomypictureboxaccordingtothecodebelow:

privatevoidbutton1_Click(objectsender,EventArgse){panel1.AutoScroll=true;pictureBox1.SizeMode=PictureBoxSizeMode.AutoSize;pictureBox1.Image=Image.FromFile("C://matrix3.jpg");
}
    
asked by anonymous 09.04.2014 / 00:52

1 answer

4

One possible solution would be to use the MouseMove from your PictureBox to apply the scrolling according to position variation of your cursor:

    // Variáveis globais:
    int posXInicial; // Posição X do mouse ao clicar/se mover sobre a imagem
    int posYInicial; // Posição Y do mouse ao clicar/se mover sobre a imagem

    enum Sentido // Sentido do movimento
    {
        Cima,
        Baixo,
        Direita,
        Esquerda
    }

    private void ScrollImg(int pixels, Sentido sent)
    {
        using (Control ctrl = new Control())
        {
            ctrl.Parent = panel1; // Define o controle pai
            switch (sent)
            {
                case Sentido.Baixo:
                    ctrl.Top = panel1.ClientSize.Height + pixels; // Adiciona pixels à distância do controle até o topo
                    break;
                case Sentido.Cima:
                    ctrl.Top = pixels * -1;
                    break;
                case Sentido.Direita:
                    ctrl.Left = panel1.ClientSize.Width + pixels;
                    break;
                case Sentido.Esquerda:
                    ctrl.Left = pixels * -1;
                    break;
                default:
                    break;
            }
            panel1.ScrollControlIntoView(ctrl); // Aplica a rolagem
        }
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        // Definindo a posição inicial (em relação à imagem) do mouse a clicar sobre a imagem:
        posXInicial = e.Location.X;
        posYInicial = e.Location.Y;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        int pixels = 15; // Número de pixels movidos ao arrastar o mouse sobre a tela

        if (e.Button == MouseButtons.Left) // Verifica se o botão esquerdo está pressionado
        {
            /* OBS:
             * Como o evento MouseMove é disparado várias vezes, é necessário
             * verificar se a posição (tanto X quanto Y) do mouse mudou se comparada à última.
             */

            if (posXInicial != e.Location.X) 
            {
                // Ajusta o movimento de acordo com a direção para a qual o mouse está sendo movido:

                if (e.Location.X > posXInicial) 
                {
                    ScrollImg(pixels, Sentido.Direita); // Chama o método de scrolling
                    posXInicial = e.Location.X + pixels; // Redefine a posição do cursor do mouse em relação à imagem
                }
                else
                {
                    ScrollImg(pixels, Sentido.Esquerda);
                    posXInicial = e.Location.X - pixels;
                }
            }

            if (posYInicial != e.Location.Y)
            {
                if (e.Location.Y > posYInicial)
                {
                    ScrollImg(pixels, Sentido.Baixo);
                    posYInicial = e.Location.Y + pixels;
                }
                else
                {
                    ScrollImg(pixels, Sentido.Cima);
                    posYInicial = e.Location.Y - pixels;
                }
            }
        }
    }

Note: To scroll the image over the Panel, I used ScrollControlIntoView . SOEN question demonstrates an interesting application of this method.

    
09.04.2014 / 18:02