7

画像ボックスをAutoSizeに設定して、画像が画像をフルサイズに拡大するようにしました。

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

ユーザーが画像のドラッグをクリックして画像の位置を変更するときに、プログラムでパネルをスクロールするにはどうすればよいですか。

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

は画像を動かしますが、あちこちにジャンプし、予期せずスクロールします。

どうすればこれを達成できますか?

これが私のマウスイベントにあるものです...

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

3 に答える 3

5

パネルをスクロールする動作により、スクロール量だけマウスの位置がずれてしまうため、ジャンプしています。次のように、「実際の」マウスの位置(パネルの左上隅からの相対位置)を取得できます。

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

ピクチャーボックスのLocationプロパティが(0、0)であると仮定します。パネルをスクロールする最良の方法は、AutoScrollPositionプロパティを設定することです。

于 2009-11-26T14:41:28.907 に答える
4

あなたの本能は正しいと思いますが、あなたの間違いは、スクロール可能なパネル内でPictureBoxを動かすのではなく、スクロールバーを調整しようとすることです。

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イベントのこの開始位置を基準にして更新する傾向があります。この理由は、何らかの理由で予期しない値が発生した場合、これは一時的な影響のみを引き起こすためです。次の適切なイベントは自己修正されます。)

于 2009-11-26T11:50:23.300 に答える
3

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

panel1.AutoScrollPosition = new Point(-panel1.AutoScrollPosition.X - e.X + startPoint.X, -panel1.AutoScrollPosition.Y - e.Y + startPoint.Y);
于 2016-06-02T01:28:30.973 に答える