怎么知道鼠标在控件上面刚停下?

北京的雾霾天 2006-11-29 11:40:40
大家可能都知道MouseHover这个事件是鼠标在控件上面刚停下了一段时间后发生的,可是当鼠标在控件内再移动后停下就不会发生了,除非鼠标离开控件再进入控件停下后再发生。我现在想知道在鼠标不离开控件的时候只要鼠标停下就调用我的一个方法而在移动的时候不调用,怎么做?
...全文
847 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
北京的雾霾天 2006-11-30
  • 打赏
  • 举报
回复
请查看这个贴子:
http://community.csdn.net/Expert/topic/5196/5196217.xml?temp=.1034815
北京的雾霾天 2006-11-30
  • 打赏
  • 举报
回复
但是感觉MouseHover事件实在诡秘,不知道怎么个算法才能做的更好更像。
GXY2005 2006-11-30
  • 打赏
  • 举报
回复
问题出在我第一次测试MouseMove事件是鼠标在控件内不动也连续触发,后来又不是了.??
只有移动才触发MouseMove事件就麻烦了,可能依靠MouseMove事件不能判断出鼠标停止
由于Windows 是消息事件机制,没有一个鼠标停止消息,还有就是鼠标停止当然没有动作也就没有事件.
我下面这个是大部分情况正确
int x=0,y=0,x1=0,y1=0;
private void textBox2_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if((Math.Abs(x-e.X)<=2)&&(Math.Abs(y-e.Y)<=2))
{
label2.Text="鼠标停止!";x1++;
}
else
{

label2.Text="鼠标移动中....";y1++;

}
x=e.X;y=e.Y;

}
大家可以测试下,x1和y1都是增加的,说明了状态的改变!当然只是一般情况下正确
灰太狼 2006-11-29
  • 打赏
  • 举报
回复
sorry說錯了,是MouseEnter和MouseMove相結合,在mouseEnter中放time定時器,在mouseMove中重置定時器。這樣可以不?
北京的雾霾天 2006-11-29
  • 打赏
  • 举报
回复
用Timer的就不必了,我觉得这不是个好方法。
jcyluck 2006-11-29
  • 打赏
  • 举报
回复
1.判断MouseMove事件退出
2.当鼠标进入控件后就不断获取光标位置,当前0.1秒的point与现在point相等时就是停止移动了
jydqwe 2006-11-29
  • 打赏
  • 举报
回复
时间间隔可以你自己设置 把计时器的间隔时间设短就可以达到你的效果。
jydqwe 2006-11-29
  • 打赏
  • 举报
回复
这个问题我刚解决 是利用一个计时器
具体这样。
private void timerHover_Tick(object sender, EventArgs e)
{
//记录现在的鼠标点
System.Drawing.Point nowPoint = DMapControl.PointToClient(MousePosition);

//如果现在时间-最后移动时间>计时器时间
if (lastMousePoint.X == nowPoint.X && lastMousePoint.Y == nowPoint.Y && DateTime.Now.Ticks - lastMouseMoveTime >= timerHover.Interval * 10000)
{

这里的LASTMOUSEPOINT和LASTMOUSEMOVETIME 都是在MOVE事件里不停的记录的
意思就是 如果 计时器的间隔时间(也就是你想设定的悬停时间) 内 鼠标没有移动的话
就是你想要的悬停事件了
  • 打赏
  • 举报
回复
MouseMove和判断相结合,然后加上动态读取控件位置………………然后……确实很费事阿
不过也使完全可以实现,不用多想的办法
我笨…………
北京的雾霾天 2006-11-29
  • 打赏
  • 举报
回复
MouseEnter不合题意。
我是说只在控件内移动停下后。只在控件内!
WeiWY 2006-11-29
  • 打赏
  • 举报
回复
MouseEnter可以不
北京的雾霾天 2006-11-29
  • 打赏
  • 举报
回复
怎么个结合法?
灰太狼 2006-11-29
  • 打赏
  • 举报
回复
MouseHover和MouseMove相結合,可以不?
北京的雾霾天 2006-11-29
  • 打赏
  • 举报
回复
我只是不想用Timer来实现,但是又想不到更好的方法,就当是散分的贴。但是如果大家提供的方法可以我是多给分的。
syfsz 2006-11-29
  • 打赏
  • 举报
回复
晕,回的是 GXY2005(晓晨美眉好^_^) 的,居然这么多人插队了
mqmmx 2006-11-29
  • 打赏
  • 举报
回复
学习,不知 "为情飞"的代码哪里没有满足楼主的要求
syfsz 2006-11-29
  • 打赏
  • 举报
回复
楼上的好像不行, 你鼠标移动怎么能得到鼠标停止的事件触发动作呢?其实你是两次移动在同一点上,表现出来 “鼠标停止!”。
如 你鼠标/连续/移动到 a 点突然停止 这个时候记录了 a 的x y 值,并停止不动,那label 显示的将是“鼠标移动中....";这个时候轻动一下鼠标就停止,会显示出 “鼠标停止!”。
应该不符合搂主的要求。
jydqwe 2006-11-29
  • 打赏
  • 举报
回复
其实每次TIMER触发的时候就是做了一个判断。
jydqwe 2006-11-29
  • 打赏
  • 举报
回复
计时器开关我是这样设置 不知道是否妥当。。
MOUSEMOVE 计时器开启 时间
if (lastMousePoint.X != e.X || lastMousePoint.Y != e.Y)
{
lastMousePoint.X = e.X;
lastMousePoint.Y = e.Y;
lastMouseMoveTime = DateTime.Now.Ticks;
timerHover.Enabled = true;
}
计时器TICK事件
//如果现在时间-最后移动时间>计时器时间
if (lastMousePoint.X == nowPoint.X && lastMousePoint.Y == nowPoint.Y && DateTime.Now.Ticks - lastMouseMoveTime >= timerHover.Interval * 10000)
{
timerHover.Enabled = false;
}
jydqwe 2006-11-29
  • 打赏
  • 举报
回复
GXY2005(晓晨美眉好^_^)
你那方法我试过 但是因为MOUSEMOVE事件是连续出发 所以你那个方法会连续赋值 导致相等
x=e.X;y=e.Y;代码可能不能放在判断的外面
同时 我的计时器功能就是为了实现控制悬停时间的功能 可能和楼主的要求有点出入?
不过在资源开销方面 并不是非常的大 可能因为我悬停时间设置为1秒的关系
加载更多回复(31)

110,567

社区成员

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

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

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