2009-11-26 3 views
6

J'ai une zone d'image définie sur AutoSize de sorte que l'image l'oblige à atteindre la taille maximale de l'image.Comment faire en sorte qu'un panneau défile par programmation pour exposer sa zone d'image AutoSize

La zone d'image est dans un panneau avec autoScroll = true, de sorte que des barres de défilement apparaissent lorsque l'image est plus grande que le panneau.

Comment puis-je faire défiler le panneau par programmation lorsque l'utilisateur clique sur les dragées sur l'image, repositionnant ainsi l'image.

J'ai essayé d'utiliser l'événement MouseMove, en capturant les dernières positions X et Y de la souris, en calculant combien la souris a bougé, et en ajustant les valeurs Vertical et Horizontal Scroll du panneau. Il fait bouger l'image, mais il saute partout, et défile de façon imprévisible.

Comment puis-je y parvenir?

Voici ce que j'ai dans mes événements de souris ...

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

Est-ce ma logique erronée ou est ma compréhension de la fonctionnalité de défilement du panneau de mal?

Répondre

4

Je crois que votre instinct est correct, mais votre erreur est de tenter d'ajuster les barres de défilement plutôt que de déplacer le PictureBox dans le panneau déroulant.

Vous devez intercepter le MouseMove et ajuster la propriété Location de PictureBox à l'aide du delta de déplacement de la souris. Les barres de défilement doivent automatiquement se mettre à jour pour refléter le nouvel emplacement de l'image.

Mise à jour votre code ressemblerait à quelque chose comme tho suivant (non testé):

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

(Aussi, je serais enclin à enregistrer la souris lieux de départ et PictureBox au début de la traînée et de les mettre à jour par rapport à cette position de départ sur chaque événement MouseMove plutôt que de faire des changements incrémentiels comme le code ci-dessus (et votre code d'origine) .La raison en est que s'il y a des valeurs inattendues, pour une raison quelconque, cela ne causera qu'un effet transitoire. le prochain bon événement se corrigera automatiquement.)

+0

Merci. Je travaille avec cette approche. La commande du panneau n'affiche pas les barres de défilement si vous déplacez le bloc d'image du haut ou du côté gauche par contre :-( –

+0

Oh, c'est bizarre - ce devrait être le cas si vous avez activé l'AutoScroll. –

5

Il saute parce que l'acte de Si vous faites défiler le panneau, la position de la souris sera déplacée par la quantité de défilement. Vous pouvez obtenir la position de la souris « réelle » (par rapport à partir du coin supérieur gauche du panneau) comme celui-ci:

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

en supposant que la zone d'image » propriété L'emplacement est (0, 0). La meilleure façon de faire défiler le panneau consiste à définir sa propriété AutoScrollPosition.

2

Vous pouvez définir le AutoScrollPosition du panneau dans l'événement MouseMove. Testé et fonctionne bien.

panel1.AutoScrollPosition = new Point(-panel1.AutoScrollPosition.X - e.X + startPoint.X, -panel1.AutoScrollPosition.Y - e.Y + startPoint.Y); 
Questions connexes