我用C#做的纸牌游戏,窗体上方放的菜单,然后放的一个Panel,用作游戏操作区,然后最下面放的几个label,用来显示分数之类的。我的纸牌全是继承的label,所有纸牌的MouseMove事件都是关联的同一个Cards_Move方法,之前没捕获鼠标,拖动纸牌时鼠标都不能拖动快了,不然纸牌会卡住不动。现在在移动方法中添加了SelectCard.Capture=true,纸牌就能很流畅的拖动了,即使拖动时鼠标移出了Panel的区域,但只要没移出窗体,也能够触发纸牌的移动事件,但只要鼠标一移出窗体,就不能触发纸牌的鼠标事件了。有什么办法可以解决?我是用的VS2008。
我觉得啼的逻辑是不是有问题啊,本来就该限制在Form内,才能拖动,不然你准备整到哪里啊
if (selectedCard != null)
{
if (selectedCard.Capture == false)
{
selectedCard.Capture = true;
}
//实现拖动效果
mousePos1 = MousePosition; //获取鼠标在屏幕上的坐标
mousePos2 = this.PointToScreen(PanelFace.Location); //获取窗体面板相对于屏幕的坐标
mousePos = new Point(mousePos1.X - mousePos2.X, mousePos1.Y - mousePos2.Y); //前两坐标之差即为鼠标在窗体中相对于窗体的坐标
mousePos.Offset(-mouseOffset.X, -mouseOffset.Y);
for (int i = 0; i < cardsmove_list.Count; i++)
{
_cardmove = (CardsItems)cardsmove_list[i];
_cardmove.Location = new Point(mousePos.X, mousePos.Y + i * fuzhu_jiange);
}
PanelFace.Update();
}
楼主不妨可以考虑下toolstripdropdown这个控件,用它可以实现类似QQ的好友可以任意拖动,QQ的表情选择框之类的都可以用它实现,因为这个控件本身就可以在超出窗体之外绘制,而且他相当于是一个载体,只要将你要显示的纸牌放进去就可以了。
Private Declare Function ReleaseCapture Lib "user32" () As Long
<DllImport("user32.dll", EntryPoint:="SendMessage")> _
Public Function SendMessage(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Const SC_MOVE = &HF012sub Cards_Move(Sender as object)
SetCapture(Sender.Handler)
SendMessage(Sender.Hander,SC_MOVE,0,0)
ReleaseCapture
end sub
http://download.csdn.net/source/1442002另外,拖放控件,以下代码可供参考: private bool isMove = false;
private Point M;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
isMove = true;
M = new Point(e.X, e.Y);
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
isMove = false;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
//this.Text = e.X + " " + e.Y;
if (isMove)
{
pictureBox1.Location = new Point(pictureBox1.Location.X + e.X - M.X, pictureBox1.Location.Y + e.Y - M.Y); }
}
还请大家多指教!
{
cardsmove_list.Clear();
selectedCard.BorderStyle = BorderStyle.None;
selectedCard = null;
}
当鼠标按下时限制鼠标: Cursor.Clip = this.Bounds;
mouseup后撤销限制,恢复鼠标移动: Cursor.Clip = cur;再次感谢你们的回复!结帖!