如题。我在WM_MOUSEMOVE消息中判断point的位置,当point坐标值不在窗体客户区中时,就是鼠标离开了,可这种方法在用户鼠标快速移出时就不灵了,用setcapture好象也不行。请大家帮忙指点一下啊!

解决方案 »

  1.   

    TrackMouseEvent http://dev.csdn.net/article/36/36994.shtm
      

  2.   

    TrackMouseEvent函数在MSDN中可以找到它的说明,在VC6中提示如下错误:
    error C2065: 'TrackMouseEvent' : undeclared identifier
    改成_TrackMouseEvent函数后,我的代码如下:
    LPTRACKMOUSEEVENT lpEventTrack;
    lpEventTrack->cbSize=sizeof(TRACKMOUSEEVENT);  //这行该怎么写
    lpEventTrack->dwFlags=TME_HOVER|TME_LEAVE;
    lpEventTrack->dwHoverTime=HOVER_DEFAULT;
    lpEventTrack->hwndTrack=this->m_hWnd;
    _TrackMouseEvent(lpEventTrack);
    可程序执行到cbSize的赋值语句就崩溃了,不知道我这样写错在哪了?请横秋朋友和各位看一下,谢谢了!
      

  3.   

    if(!m_bTrack)
    {
    TRACKMOUSEEVENT tme;
    tme.cbSize=sizeof(TRACKMOUSEEVENT);
    tme.dwFlags=TME_HOVER | TME_LEAVE;
    tme.dwHoverTime=HOVER_DEFAULT;
    tme.hwndTrack=m_hWnd; m_bTrack=_TrackMouseEvent(&tme);
    }LPTRACKMOUSEEVENT lpEventTrack是个指针,没有初始化。
    所以lpEventTrack->cbSize出错
      

  4.   

    晕死,犯了这样的错误,感谢楼上zjh824(coder)的提醒,现在我可以用这个函数成功捕捉鼠标的特定事件了,可我如何接收WM_MOUSELEASE和WM_MOUSEHOVER消息呢,我用下面代码在PreTranslateMessage函数中接收不到,方法不对么?
    if(pMsg->message==WM_MOUSELEAVE)
    AfxMessageBox("WM_MOUSELEAVE");
    return CDialog::PreTranslateMessage(pMsg);
      

  5.   

    手动添加消息响应WM_MOUSELEASE。
    .h
    afx_msg LRESULT OnMouseLeave(WPARAM wParam,LPARAM lParam);
    afx_msg LRESULT OnMouseHover(WPARAM wParam,LPARAM lParam);
    .cpp
    ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
    ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)LRESULT CMyButton::OnMouseLeave(WPARAM wParam,LPARAM lParam)
    {
    m_bMouseOver=FALSE;
    m_bTrack=FALSE; InvalidateRect(NULL);
    return 0;
    }LRESULT CMyButton::OnMouseHover(WPARAM wParam,LPARAM lParam)
    {
    m_bMouseOver=TRUE; InvalidateRect(NULL);
    return 0;
    }
      

  6.   

    To zjh824(coder)朋友:
    已经按上面说的方法添加了消息响应WM_MOUSELEASE,还是不能收到消息WM_MOUSELEASE.我是在对话框的OnInitDialog中添加_TrackMouseEvent函数的:
    TRACKMOUSEEVENT tme;
    tme.cbSize=sizeof(TRACKMOUSEEVENT);
    tme.dwFlags=TME_HOVER | TME_LEAVE;
    tme.dwHoverTime=HOVER_DEFAULT;
    tme.hwndTrack=m_hWnd; m_bTrack=_TrackMouseEvent(&tme);
    错了吗?
    再加30分,还请多多赐教!!如果你有范例的话,请发到:
    [email protected]
    不甚感激!!!
      

  7.   

    这个函数段应该加到mousemove的消息响应中。
    在对话框的OnInitDialog中添加_TrackMouseEvent是无效的。函数会返回,然后就收不到MOUSE的消息了。
      

  8.   

    解决了。下面把问题的解决方法重新整理一遍:
    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函数中接收,不需要自己写WM_MOUSELEASE和WM_MOUSEHOVER消息的响应函数(当然你要自己写也行):
    if(pMsg->message==WM_MOUSELEAVE) 
        AfxMessageBox("mouse leave");
    return CDialog::PreTranslateMessage(pMsg);这样就可以了,不过这种方法的不足之处是:当用上面代码时,鼠标移进窗体中子窗口范围内时也算离开了m_hWnd窗口,这也是一个Bug。当你只想检测鼠标是否离开一个子窗口内时_TrackMouseEvent是很好用的函数(在VC中别把前面的下划线给忘了^_^)。结贴了,特别鸣谢横秋朋友给出的方法和zjh824(coder)朋友耐心的解释和详细的代码!!