0

C# winforms でパンの pictureBox を実装したいと考えています。autoScroll プロパティが true に設定されているパネルがあります。パネル内には、sizeMode が autoSize に設定されている pictureBox があります。pictureBox では、次のようなマウス イベントをリッスンしています。

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        dragging = true;
        start = new Point(e.Location.X + pictureBox1.Location.X, e.Location.Y + pictureBox1.Location.Y);
    }
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Debug.WriteLine("mousemove X: " + e.X + " Y: " + e.Y);

        pictureBox1.Location = new Point(start.X - e.Location.X, start.Y - e.Location.Y);
        this.Refresh();
    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    Debug.WriteLine("mouseup");

    dragging = false;
}

問題は、ボタンを離した後も何かが mouseMove イベントを発生させ続け、画像が本来よりもはるかにゆっくりとパンされていることです。画像を数ピクセル (おそらく 2 または 3) ドラッグすると、ボタンを放した後、画像が数秒間パンされ、出力は次のようになります。

mousemove X: 66 Y: 37 mousemove X: 66 Y: 38 mousemove X: 66 Y: 39 mousemove X: 66 Y: 40 mousemove X: 66 Y: 41 mousemove X: 66 Y: 42 mousemove X: 66 Y: 43 mousemove X: 66 Y: 44 マウスムーブ X: 66 Y: 45 マウスムーブ X: 66 Y: 46

そう...

4

1 に答える 1

4

推測するのは難しい。ただし、マウスの座標処理が間違っていると、PBがすぐに遠くの隅に送られます。また、フォームのRefresh()メソッドを呼び出さないでください。再描画しても意味がありません。修理:

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            dragging = true;
            start = e.Location;
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
        if (dragging) {
            Debug.WriteLine("mousemove X: " + e.X + " Y: " + e.Y);

            pictureBox1.Location = new Point(pictureBox1.Left + e.Location.X - start.X,
                pictureBox1.Top + e.Location.Y - start.Y);
        }
    }
于 2012-01-24T11:19:25.237 に答える