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

本文关键字:对象 MouseDown MouseUp | 更新日期: 2023-09-27 17:59:01

我正在尝试克隆扫雷舰,但我在鼠标事件方面遇到了问题。如果我在picturebox上按下鼠标按钮,然后将鼠标移动到另一个框,则mouseup事件仍然具有相同的对象发送方,即使它发生在另一个控件上。

我需要mousedown事件,这样我就可以看到是否按下了两个鼠标按钮,不幸的是,当我释放按钮时,mouseup事件似乎并不关心光标在哪里。

如果我表达不清楚,想想扫雷舰吧。我想能够左键点击,右键点击,同时点击,也能够在按下后移动光标,打开我释放它的瓷砖。

有人有什么想法吗?

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

我设法找到了一些能起作用的东西,如果将来有人需要,我会把它留在这里。

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

我用一些picturebox设置了一个简单的表单,当mouseup事件发生时,它会检查光标位置下的控件,然后您可以根据需要使用它。我遇到的问题是,mouseup事件与mousedown事件发生的控件绑定,因此当mouseup发生时,我无法访问光标所在的控件。

我只编程了大约4周,所以这个解决方案可能有很大的缺陷,所以如果有任何问题,一些反馈会很好。

就我个人而言,我通过在每次MouseMove事件中更新一个表单级别的Point变量来实现这一点。然后,当其他鼠标事件发生时,它们有最新的可用事件。

我想这样做:

  1. 创建子类按钮以包含游戏资产作为其电子图片
  2. 创建自定义控件并根据需要添加任意多个按钮
  3. 点击鼠标时,我会再次检查BoundsContains方法,看看点击是否发生在特定按钮上,或者在自定义控件内以其他方式处理按钮点击

如果我们看到你的一些代码,并可能看到一张屏幕截图,那会有更多帮助。

更新:

这是一个如何使用代理处理单击的示例。

public partial class MineSweeper : UserControl
{
    public MineSweeper()
    {
        InitializeComponent();
    }
    private void MineSweeper_Load(object sender, EventArgs e)
    {
        this.BackColor = Color.Red;
        for (int i = 0; i < 16; i++)
        {
            var button = new Button();
            button.Name = "Button" + i;
            button.Size = new Size(50, 50);
            button.ForeColor = Color.Yellow;
            button.ForeColor = Color.Black;
            button.Click += delegate
            {
                MessageBox.Show("You have clicked me! I am " + button.Name);
            };
            flowLayoutPanel1.Controls.Add(button);
            flowLayoutPanel1.Invalidate();
        }
        this.Invalidate();
    }
}

只需从设计器中添加一个新的UserControl,向其添加一个flowLayoutPanel,并将其dock属性设置为full。

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