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.