我有一个PictureBox,用户可以向上或向下拖动。不寻常的拖动问题
有问题的程序是一个复杂的音乐钢琴工作人员的编辑,因此实现工作人员笔记的移动的唯一方法是通过一些if语句和修改坐标。
问题是用户无法移动PictureBox组件,但是当对象被拖动时,什么都不会发生。该类继承自PictureBox。
我只想强调图片框在向下拖动时工作,但在向上拖动时不会移动。拖动是间隔进行的,即PictureBox只能放在某些地方(因此需要特定的坐标)。
我有一个PictureBox,用户可以向上或向下拖动。不寻常的拖动问题
有问题的程序是一个复杂的音乐钢琴工作人员的编辑,因此实现工作人员笔记的移动的唯一方法是通过一些if语句和修改坐标。
问题是用户无法移动PictureBox组件,但是当对象被拖动时,什么都不会发生。该类继承自PictureBox。
我只想强调图片框在向下拖动时工作,但在向上拖动时不会移动。拖动是间隔进行的,即PictureBox只能放在某些地方(因此需要特定的坐标)。
您的当前解决方案有时可能会有效,但是当您尝试拖动控件并将其对齐回到您在if
语句中指定的坐标时,可能会经常调用该事件。
建议解决方案:
我建议你在包含要拖动控制形式或家长使用MouseMove
事件。这些值也应该是可配置的,而不是硬编码的。 代码只会改变一点(比较当前的鼠标坐标而不是控件的Left
和Top
属性),它应该可以正常工作。
UPDATE:
我已经纠正了你的代码,因此它现在的作品可以让你把一个控制在三个地方之一(Ÿ等于,或)。我只改变了一点,不要求你改变很多代码,但我强烈建议你使用第一种方法描述:)。
int currentY;
bool isDragging = false;
private void OnDrag(object sender, MouseEventArgs e)
{
if (isDragging)
{
//calculate Y position relative to parent
int parentY = this.Top + e.Y;
if (parentY < currentY)
{
if (parentY > 158 && parentY >= 148)
{
if (this.Top != 148)
{
currentY += (this.Top - 148);
this.Top = 148;
}
}
else if (parentY < 148 /*&& parentY >= 138*/)
{
if (this.Top != 138)
{
currentY += (this.Top - 138);
this.Top = 138;
}
}
//And so on
}
else if (parentY > currentY)
{
if (/*parentY <= 158 &&*/ parentY >= 148)
{
currentY += (this.Top - 158);
this.Top = 158;
}
else if (parentY < 148 && parentY >= 138)
{
currentY += (this.Top - 148);
this.Top = 148;
}
//And so on
}
}
}
public void MusicNote_MouseDown(object sender, MouseEventArgs e)
{
currentY = this.Top + e.Y;
this.Capture = true;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
isDragging = true;
}
this.MouseMove += new MouseEventHandler(OnDrag);
}
public void MusicNote_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
this.Capture = false;
this.MouseMove -= new MouseEventHandler(OnDrag);
}
但是,以前的解决方案可能会更符合您的需求。
感谢您的回复!您是否可以详细解释“快速建议的解决方案”?不知道我是否明白你的意思。 – 2011-12-20 20:40:29
试过这个,仍然有这个问题。 – 2011-12-20 22:30:00
感谢卢卡斯的援助,不幸的是这也没有奏效。这可能是由于PictureBox类的缺陷。我仍然会标记你的努力的答案 - 也许这将有助于未来的其他人。非常感谢! – 2011-12-23 09:47:43
(无关:我会发现你的'顶部'检查*更容易阅读,如果他们在[数行顺序](http://stackoverflow.com/a/3188857/71059) - 你可能或可能不同意) – AakashM 2011-12-20 17:42:09
这段代码不够好来诊断它。典型的问题是移动控件也会改变鼠标的相对位置。 – 2011-12-20 17:44:45
奇怪的是,当我向下移动鼠标时,它可以正常工作 - 它实际上完美地工作。但是当我将鼠标移开时,它没有。即时消息使用几乎相同的确切代码适用于这两种情况。 – 2011-12-20 17:46:49