2009-11-26 10 views
6

画像ボックスのサイズを画像のフルサイズに拡大するように、画像ボックスをAutoSizeに設定しています。パネルをプログラムでスクロールさせてAutoSized画像ボックスを表示させるには

画像ボックスはautoScroll = trueのパネルにあり、画像がパネルよりも大きくなるとスクロールバーが表示されます。

ユーザーがイメージ上のドラッグをクリックすると、プログラムでスクロールしてイメージの位置を変更できます。

マウスの最後のX位置とY位置をキャプチャし、マウスの移動量を計算し、パネルの垂直スクロール値と水平スクロール値を調整して、MouseMoveイベントを使用しようとしました。

画像は周囲を移動しますが、場所全体をジャンプし、予期せずスクロールします。

どうすればこの問題を解決できますか?

ここで私は私のマウスイベントに持っているものだ...

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

は私の論理は間違っているか、パネルのスクロール機能の私の理解が間違っていますか?

答えて

4

私はあなたの本能が正しいと思っていますが、スクロールバー内のピクチャボックスを移動するのではなく、スクロールバーを調整しようとするのが間違いです。

MouseMoveを傍受し、マウスの動きのデルタでPictureBoxのLocationプロパティを調整する必要があります。スクロールバーは自動的に更新され、画像の新しい場所が反映されます。

あなたのコードを更新する(未テスト)以下のカントーのようになります。

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

(また、私は、ドラッグの開始時に始まるマウスとのPictureBox位置を記録してまで彼らが相対的に更新するように傾斜されるだろうこのMouseMoveイベントの開始位置は、上のコード(および元のコードと同じ)でインクリメンタルな変更を加えるのではなく、予期しない値があれば何らかの理由で一時的な効果しか生じません。次の良いイベントは自己修正されます。)

+0

ありがとうございました。私はこのアプローチに取り組んでいます。 画像ボックスを上端または左端から移動すると、パネルコントロールにスクロールバーが表示されません.-( –

+0

ああ、それは奇妙です。 –

5

fパネルをスクロールすると、スクロール量だけマウスの位置がスローされます。

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

ピクチャボックス」Locationプロパティがあると仮定すると(0、0):あなたは、このような(パネルの左上隅からの相対)「本当の」マウスの位置を取得することができます。パネルをスクロールする最善の方法は、AutoScrollPositionプロパティを設定することです。

2

MouseMoveイベントでパネルのAutoScrollPositionを設定できます。テストされ、正常に動作します。

panel1.AutoScrollPosition = new Point(-panel1.AutoScrollPosition.X - e.X + startPoint.X, -panel1.AutoScrollPosition.Y - e.Y + startPoint.Y); 
関連する問題