拖放一些东西

时间:2016-03-31 20:06:59

标签: c# drag-and-drop draggable

我做了一个class Schalter(eng。开关),现在我想把它拖放到另一个位置。 Schalter只是一个输出为0或1的对象,它有一些绘图。我尝试了一些东西但它刚刚工作了一半。当我移动它时它移动得太快了。 这里是我尝试的代码:

namespace Schaltungszeichner {
public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        s = new Schalter(this);
        this.DoubleBuffered = true;
    }

    private bool myMouseDown = false;
    private int myMouseX, myMouseY;

    Schalter s;

    private void Form1_Paint(object sender, PaintEventArgs e) {
        s.zeichnen(e.Graphics);
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e) {
        if (myMouseDown) {
            s.X += e.X - myMouseX;
            s.Y += e.Y - myMouseY;
        }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e) {
        myMouseDown = false;
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e) {
        if (s.isClicked(e.X, e.Y)) {
            s.Out = !s.Out;
            myMouseDown = true;
            myMouseX = e.X;
            myMouseY = e.Y;

        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

问题是MouseEventArgs相对于拥有事件的对象而不是被移动的对象保持鼠标位置。您需要通过减去移动物体的起始位置来解释这一点。

Form1_MouseDown 中更改:

myMouseX = e.X;
myMouseY = e.Y;

为:

myMouseX = e.X - s.X;
myMouseY = e.Y - s.Y;

Form1_MouseMove 中更改:

s.X += e.X - myMouseX;
s.Y += e.Y - myMouseY;

为:

s.X = e.X - myMouseX;
s.Y = e.Y - myMouseY;

我还会考虑将 myMouseX myMouseY 重命名为反映他们现在持有的值的内容,例如 differenceX differenceY