C#里如何定位鼠标在一个按钮上...

编程爱好者L 2010-09-28 10:36:01
我最近实现了一个鼠标拖动按钮的功能,鼠标点击按钮可以在窗体上任意的拖动,但是问题出现了,在拖动的过程中如果我的鼠标移动得很快的话,鼠标就会移出按钮的可见部位,按钮还是可以拖动,但是鼠标已经不在按钮上了,有什么办法可以是鼠标定位在按钮上吗?
...全文
764 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程爱好者L 2010-09-29
  • 打赏
  • 举报
回复
private bool btnBool = false;
private Point btnStart;
private Point btnEnd;
/// <summary>
/// 按钮移动事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_MouseMove(object sender, MouseEventArgs e)
{
if (btnBool)
{
//移动后的坐标
btnEnd = Cursor.Position;
//计算坐标值
GetButtonLoction();
//移动完按钮后把现在光标的坐标付给开始坐标
btnStart = Cursor.Position;
}
}
Point mouse_offset;
/// <summary>
/// 点击按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_MouseDown(object sender, MouseEventArgs e)
{
Button bt = sender as Button;
bt.FlatAppearance.BorderSize = 1;
btnBool = true;
//开始坐标
btnStart = Cursor.Position;
CtrlForm.Cursor = Cursors.SizeAll;
}

/// <summary>
/// 单击释放按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_MouseUp(object sender, MouseEventArgs e)
{
btnBool = false;
//光标释放坐标
btnEnd = Cursor.Position;
CtrlForm.Cursor = Cursors.Default;
}

/// <summary>
/// 改变按钮坐标位置
/// </summary>
private void GetButtonLoction()
{
//坐标差值
Point p = new Point(btnEnd.X - btnStart.X, btnEnd.Y - btnStart.Y);
for (int i = 0; i < listButton.Count; i++)
{
Button bt = listButton[i];
if (bt.FlatAppearance.BorderSize > 0)
{
bt.Location = new Point(bt.Location.X + p.X, bt.Location.Y + p.Y);
bt.Refresh();
}
}
}

看看代码你们就知道了/
xiao_rory 2010-09-29
  • 打赏
  • 举报
回复
那不就是在窗体的mouseup事件得到所有选中的control list
然后在某个按钮的mousedown,mouseup中改location么。
编程爱好者L 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 xiao_rory 的回复:]
不知道理解的正不正确,但这样可以控件button1跟着鼠标动,移动得再快都没问题
public Form1()
{
InitializeComponent();
}

private bool bMouseDown = false;

private void Form1_MouseDown(object sender, MouseEventArgs e)
……
[/Quote]
谢谢你的代码,大家可能还没明白我的意思,我的实现方式是这样的,鼠标首先在窗体上点击拖动选择多个按钮,然后我再点击某个按钮对刚才选择的按钮进行拖动,在拖动的过程中,不管我鼠标移动得多快,使鼠标始终定位在那个按钮上,就像我们电脑上选择多个文件夹进行移动那样..
编程爱好者L 2010-09-29
  • 打赏
  • 举报
回复
代码说话....
龍月 2010-09-29
  • 打赏
  • 举报
回复
给他一个范围 范围就是窗体的大小
mwp 2010-09-29
  • 打赏
  • 举报
回复
取按钮的 ClientRect ,计算鼠标的坐标是否在 Rect 范围内
编程爱好者L 2010-09-28
  • 打赏
  • 举报
回复
都是我在发话..我哭~~~
wuguoxian001 2010-09-28
  • 打赏
  • 举报
回复
我也不会 向楼主学习
编程爱好者L 2010-09-28
  • 打赏
  • 举报
回复
没有来....
编程爱好者L 2010-09-28
  • 打赏
  • 举报
回复
我觉得应该是我算法的错误,思路是这样的,鼠标点击按钮得到当前坐标位置,鼠标移动后得到移动后的坐标位置,然后用移动后的坐标位置减去点击按钮的开始坐标位置,再用按钮坐标+减去的坐标得到最终坐标.
编程爱好者L 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 holyplace 的回复:]
引用 3 楼 qq123592624 的回复:
你们说的方法我试过了都不行....如果是根据按钮坐标计算,鼠标跳动大而且闪得厉害

使用这个判断鼠标是否静止
http://topic.csdn.net/u/20090115/17/07eb52d9-c348-44cd-bf18-ee19cae6d161.html
如果做一个监听如果鼠标没动,就执行按钮重新定位,这样就不闪
[/Quote]
不行,鼠标移动的快还是会出去..
hgyin212314 2010-09-28
  • 打赏
  • 举报
回复
学习,帮不忙
gavinmark 2010-09-28
  • 打赏
  • 举报
回复
mark下。继续学习。
HolyPlace 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq123592624 的回复:]
你们说的方法我试过了都不行....如果是根据按钮坐标计算,鼠标跳动大而且闪得厉害
[/Quote]
使用这个判断鼠标是否静止
http://topic.csdn.net/u/20090115/17/07eb52d9-c348-44cd-bf18-ee19cae6d161.html
如果做一个监听如果鼠标没动,就执行按钮重新定位,这样就不闪
编程爱好者L 2010-09-28
  • 打赏
  • 举报
回复
如梦大哥,期待你的帮助啊....
xiao_rory 2010-09-28
  • 打赏
  • 举报
回复
不知道理解的正不正确,但这样可以控件button1跟着鼠标动,移动得再快都没问题
public Form1()
{
InitializeComponent();
}

private bool bMouseDown = false;

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
bMouseDown = true;
while (bMouseDown&&button1.FlatAppearance.BorderSize > 0)
{
button1.Location = new Point(Cursor.Position.X - this.Location.X, Cursor.Position.Y - this.Location.Y);
Application.DoEvents();
}
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
bMouseDown = false;
}
编程爱好者L 2010-09-28
  • 打赏
  • 举报
回复
那位大虾说说,我们用鼠标移动窗体的时候,鼠标怎么定位得那么好,不管我的鼠标移得多快,鼠标都是在那一点上????
flyerwing 2010-09-28
  • 打赏
  • 举报
回复
GetCursorPos(&oldPoint); //保存当前鼠标位置。     
SetCursorPos(newPoint.x,newPoint.y); //设置目的地位置。
估计得调WINDOWS的API吧
编程爱好者L 2010-09-28
  • 打赏
  • 举报
回复
你们说的方法我试过了都不行....如果是根据按钮坐标计算,鼠标跳动大而且闪得厉害
HolyPlace 2010-09-28
  • 打赏
  • 举报
回复
直接通过 按钮.PointToScreen获取按钮坐标结合按钮的长宽和鼠标的坐标计算
加载更多回复(10)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧