我想创建一个纸牌游戏。我使用mousemove事件通过窗口拖动卡片。问题是如果我将鼠标移动到另一张卡上,它会被卡住,因为鼠标光标下面的卡会获得鼠标事件,因此不会触发窗口的MouseMove事件。
这就是我的所作所为:
private void RommeeGUI_MouseMove(object sender, MouseEventArgs e)
{
if (handkarte != null)
{
handkarte.Location = this.PointToClient(Cursor.Position);
}
}
我尝试了以下内容,但没有区别:
SetStyle(ControlStyles.UserMouse,true);
SetStyle(ControlStyles.EnableNotifyMessage, true);
Iam正在寻找一种实现应用程序全局事件处理程序的方法或实现所谓的事件冒泡的方法。至少我想让鼠标忽略某些控件。
答案 0 :(得分:2)
为此,您需要跟踪代码中的一些内容:
为了只移动控件,不需要实际捕获鼠标。
一个简单的例子(使用Panel控件作为“牌”):
Panel _currentlyMovingCard = null;
Point _moveOrigin = Point.Empty;
private void Card_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_currentlyMovingCard = (Panel)sender;
_moveOrigin = e.Location;
}
}
private void Card_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && _currentlyMovingCard != null)
{
// move the _currentlyMovingCard control
_currentlyMovingCard.Location = new Point(
_currentlyMovingCard.Left - _moveOrigin.X + e.X,
_currentlyMovingCard.Top - _moveOrigin.Y + e.Y);
}
}
private void Card_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && _currentlyMovingCard != null)
{
_currentlyMovingCard = null;
}
}
答案 1 :(得分:1)
您可以做的是将MouseDown事件发送到您要调用的event.function。
假设你在“卡片”上有一个“标签”,但是你不想“通过”它:
private void Label_MouseDown( object sender, MouseEventArgs)
{
// Send this event down the line!
Card_MouseDown(sender, e); // Call the card's MouseDown event function
}
现在调用适当的事件函数,即使单击了令人烦恼的标签。
答案 2 :(得分:0)
通常你在捕获鼠标之前,看看是否有其他人拥有它......