VC中控件或者对话框的鼠标离开消息

    技术2022-05-20  33

    1 把下面代码加进对话框的WM_MOUSEMOVE的消息响应中      TRACKMOUSEEVENT    tme;      tme.cbSize=sizeof(TRACKMOUSEEVENT);      tme.dwFlags=TME_HOVER    |    TME_LEAVE;      tme.dwHoverTime=HOVER_DEFAULT;      tme.hwndTrack=m_hWnd;      if(!_TrackMouseEvent(&tme))              AfxMessageBox("鼠标事件捕捉失败!");      2 然后你直接可以用下面代码在PreTranslateMessage或者WinPro函数中接收,不需要自己写WM_MOUSELEASE和WM_MOUSEHOVER消息的响应函数(当然你要自己写也行):      if(pMsg->message==WM_MOUSELEAVE)                AfxMessageBox("mouse    leave");      return    CDialog::PreTranslateMessage(pMsg);          这样就可以了,不过这种方法的不足之处是:当用上面代码时,鼠标移进窗体中子窗口范围内时也算离开了m_hWnd窗口,这也是一个Bug。当你只想检测鼠标是否离开一个子窗口内时_TrackMouseEvent是很好用的函数(在VC中别把前面的下划线给忘了^_^)。

    标题  关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息。      选择自 whoo 的 Blog 关键字  关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息。出处  

      

    这两个消息比较古怪,虽然你能找到他们的定义,看起来也似乎挺有用,但是却接收不到。刚才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.   }}


    最新回复(0)