关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息。

类别:编程语言 点击:0 评论:0 推荐:

这两个消息比较古怪,虽然你能找到他们的定义,看起来也似乎挺有用,但是却接收不到。刚才csdn有人问到这个问题,我就随手答了一下,随便贴到这里,以做保存。

----------------------------------------

WM_MOUSELEAVE ,WM_MOUSEENTER 应该算是个自定义的消息,因为Windows通常都不会发送这个消息。只有你调用TrackMouseEvent 才会收到这个消息。

实际上这个消息 是 TrackMouseEvent 而不是windows 发出的。很奇怪微软会定义出这样子的API。而且TrackMouseEvent 个人感觉也不大好用(主要是感觉别扭,不是说功能不行)。其实TrackMouseEvent 的原理也蛮简单的,自己三两句语句就搞定了,不必理会微软搞的这个古里古怪的API,还得去查找消息定义。

原理如下:
鼠标在窗口区域时会收到MouseMove消息,第一次收到这个消息时 就是 WM_MOUSEENTER。
On_MouseMove(...)
{
  static BOOL bFirst = TRUE;
  if (bFirst)
  {
    // PostMessage(WM_MOUSEENTER...) or call some function.
    bFirst = FALSE;
    SetTimer(...);
  }  
}

在 Mouse Enter 自后启动了一个计时器, 通常100ms 就足够了。计时器里检测鼠标是否离开。
On_Timer(...)
{
...
  GetCursorPos(pt);
  GetWindowRect(rect);
  if (PtInRect(&rect,pt))
  {
    KillTimer(...); // kill self.
    PostMessage(WM_MOUSELEAVE...); // or call some function.
  }
}

本文地址:http://com.8s8s.com/it/it27634.htm