如题,基于对话框的程序,本来想利用CRect::PtInRect()来监测鼠标位置,用GetClentRect()得到了客户区Rect(),然后在OnMouseMove()中用if(!rect.PtInRect(point))来监测,但是不行。我觉得好像是当鼠标移出程序窗口后,就不能向程序发消息了,所以if(!rect.PtInRect(point)){}中的语句不可能执行到。如果用了程序一起来就用SetCapture(),程序运行中可能有别的地方也需要鼠标消息。所以这方法似乎不可行。在MSDN上查到有一个WM_MOUSELEAVE的消息,但也知道怎么用。应该怎么样才可以知道鼠标移出了程序窗口呢?

解决方案 »

  1.   

    使用SetCapture方法来让鼠标对某个窗口有效
      

  2.   

    谢谢楼上大侠的回复。WM_MOUSELEAVE没有用过,要在哪里响应呢,在对话框类吗?在程序运行中一直SetCapture()好像不合理。能说清楚一些吗?
      

  3.   

    WindowFromPoint,然后检测该Window是不是自身
      

  4.   

    谢谢两位的帮助,我已经从网上找到的相关的WM_MOUSELEAVE的代码,原来需要调用TrackMouseEvent()才可以收到WM_MOUSELEAVE,问题顺利解决。相关代码如下:测试鼠标是否在窗口内,以及鼠标的离开使用TrackMouseEvent()在鼠标离开窗口时发送WM_MOUSELEAVE消息使用TrackMouseEvent()还可以判断鼠标的停留,并发送WM_MOUSEHOVER消息
    //设置一个状态量用于记录和标识鼠标是否在窗口内
    //BOOLm_bMouseTracking;//处理鼠标移动消息
    voidCSomeWnd::OnMouseMove(UINTnFlags,CPointpoint)
    {
    //接收到WM_MOUSEMOVE,而m_bMouseTracking为假时,鼠标进入窗口。
    //设置_TrackMouseEvent
    if(!m_bMouseTracking)
    {
    TRACKMOUSEEVENTtme;
    tme.cbSize=sizeof(TRACKMOUSEEVENT);
    //监控鼠标离开
    tme.dwFlags=TME_LEAVE;
    tme.hwndTrack=this->m_hWnd;if(::_TrackMouseEvent(&tme))
    {
    m_bMouseTracking=TRUE;//
    //其他鼠标进入时的操作
    //
    }
    }CView::OnMouseMove(nFlags,point);
    }//
    //处理WM_MOUSELEAVE消息
    ////消息处理函数声明
    afx_msgLRESULTOnMouseLeave(WPARAMwParam,LPARAMlParam);//消息映射
    ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)//处理函数定义
    LRESULTCSomeWnd::OnMouseLeave(WPARAMwParam,LPARAMlParam)
    {
    //
    //其他鼠标离开时的操作
    ////重置状态量
    m_bMouseTracking=FALSE;
    returnTRUE;
    }