我正在尝试克隆扫雷舰,但我在鼠标事件方面遇到了问题。如果我在picturebox上按下鼠标按钮,然后将鼠标移动到另一个框,则mouseup事件仍然具有相同的对象发送方,即使它发生在另一个控件上。
我需要mousedown事件,这样我就可以看到是否按下了两个鼠标按钮,不幸的是,当我释放按钮时,mouseup事件似乎并不关心光标在哪里。
如果我表达不清楚,想想扫雷舰吧。我想能够左键点击,右键点击,同时点击,也能够在按下后移动光标,打开我释放它的瓷砖。
有人有什么想法吗?
我设法找到了一些能起作用的东西,如果将来有人需要,我会把它留在这里。
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变量来实现这一点。然后,当其他鼠标事件发生时,它们有最新的可用事件。
我想这样做:
- 创建子类按钮以包含游戏资产作为其电子图片
- 创建自定义控件并根据需要添加任意多个按钮
- 点击鼠标时,我会再次检查
Bounds
的Contains
方法,看看点击是否发生在特定按钮上,或者在自定义控件内以其他方式处理按钮点击
如果我们看到你的一些代码,并可能看到一张屏幕截图,那会有更多帮助。
更新:
这是一个如何使用代理处理单击的示例。
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);
}