MouseUp和MouseDown始终具有相同的对象发送方

时间:2014-04-18 20:59:01

标签: c# winforms mouseevent minesweeper

我试图制作一个扫雷克隆,但我遇到了鼠标事件的问题。如果我按下图片框上的鼠标按钮,然后将鼠标移动到另一个框,鼠标事件将仍然具有相同的对象发件人,即使它发生在另一个控件上。

我需要mousedown事件,以便我可以看到是否已按下两个鼠标按钮,遗憾的是,当我释放按钮时,mouseup事件似乎并不关心光标所在的位置。

如果我没有清楚表达自己,请考虑扫雷。我希望能够左键单击,右键单击,同时单击它们,也可以在按下并打开我释放它的磁贴后移动光标。

有没有人有任何想法?

4 个答案:

答案 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)

我会这样做:

  1. 创建子类按钮以将游戏资源包含为图片。
  2. 创建自定义控件并添加必要的按钮
  3. 点击鼠标后,我会再次查看Contains的{​​{1}}方法,看看是否在该特定按钮上发生了点击,或者是另一种方式处理自定义控件内的按钮点击
  4. 如果我们看到你的一些代码并且可能是截图,那将会有所帮助。

    更新

    这是如何使用委托来处理点击的一个示例。

    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);
}