我做了一个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;
}
}
}
}
答案 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