我试图制作一个扫雷克隆,但我遇到了鼠标事件的问题。如果我按下图片框上的鼠标按钮,然后将鼠标移动到另一个框,鼠标事件将仍然具有相同的对象发件人,即使它发生在另一个控件上。
我需要mousedown事件,以便我可以看到是否已按下两个鼠标按钮,遗憾的是,当我释放按钮时,mouseup事件似乎并不关心光标所在的位置。
如果我没有清楚表达自己,请考虑扫雷。我希望能够左键单击,右键单击,同时单击它们,也可以在按下并打开我释放它的磁贴后移动光标。
有没有人有任何想法?
答案 0 :(得分:1)
我设法找出了可以解决问题的方法,如果其他人将来需要它,就把它留在这里。
private void MouseUp(object sender, MouseEventArgs e)
{
Point ptCursor = Cursor.Position;
ptCursor = PointToClient(ptCursor);
PictureBox pBox = (PictureBox)GetChildAtPoint(ptCursor);
pBox.BackColor = System.Drawing.Color.Blue;
}
我设置了一个带有一些图片框的简单表单,当鼠标事件发生时,它会检查游标位置下的控件,然后您可以根据需要使用它。我遇到的问题是mouseup事件与mousedown事件发生的控件绑定,因此当mouseup事件发生时我无法访问光标所在的控件。
我只编程了大约4周,所以这个解决方案可能存在很大的缺陷,所以如果有任何问题,一些反馈会很棒。
答案 1 :(得分:0)
我会这样做:
Contains
的{{1}}方法,看看是否在该特定按钮上发生了点击,或者是另一种方式处理自定义控件内的按钮点击如果我们看到你的一些代码并且可能是截图,那将会有所帮助。
更新
这是如何使用委托来处理点击的一个示例。
Bounds
只需从设计器添加一个新的UserControl,向其添加一个flowLayoutPanel并将其dock属性设置为full。
答案 2 :(得分:0)
就个人而言,我通过在每个MouseMove事件上更新表单级别的Point变量来实现此目的。然后,当其他鼠标事件发生时,它们会有最新的可用。
答案 3 :(得分:0)
[VS 2017 c#]仅在鼠标左键内捕获点时才使用MouseEventArgs
进行鼠标向下/向上移动,如下所示。
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
//??? this changes at UP time and becomes same as MouseArgsUpPoint
//MouseArgsDownPoint = new Point(e.X, e.Y);
//same as above, MouseArgsDownPoint = PointToClient(MousePosition);
if (e.Button == MouseButtons.Left)
{
//inside here it works fine and Up/Down points are different and correct
MouseArgsDownPoint = new Point(e.X, e.Y);
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
MouseArgsUpPoint = new Point(e.X, e.Y);
}