Cwnd派生的对象,如何检测鼠标是否在窗口内,用什么消息。
用什么方法知道鼠标已经移到窗口外了,
thanks!

解决方案 »

  1.   

    CRect rect;
    AfxGetMainWnd()->GetWindowRect(&rect);
    ScreenToClient(&rect);
    if(rect.PtInRect(point))
    MessageBox("在客户区中");
      

  2.   

    您的方法并不高明,我早试过。
    可能大家没有明白我的问题,我需要在鼠标移出窗口时,执行某些动作。首先,鼠标移到窗口外,不会发消息给窗口,所以在什么消息响应函数中设置都只能得到鼠标在窗口的消息,但鼠标移到窗口外,并不会发送WM_MOUSEMOVE、 WM_NCHITTEST等类似的消息给窗口,因此,依然无法得到消息。继续等待.....
      

  3.   

    不,好象有一个函数可以有这个功能,消息只发送给指定的窗口的,不记得具体是那个函数去了,是一个全局的函数,没有封装到MFC中,好象是Set...,不好意思,实在记不起来了,身边没有书可找。
      

  4.   

    SetCapture()函数可以保证当鼠标移动出窗口的时候依然收到消息
    WM_NCHITTEST则测试鼠标点和窗口的非客户区之间的关系
      

  5.   

    wm_nchittest消息也不能对CView对象以外的位置产生消息和动作。
    SetCapture()函数已经用到鼠标拖动中,并且有释放捕捉的函数,
    因此,都不是标准用法;不推荐使用。继续等待.....
      

  6.   

    使用TrackMouseEvent()在鼠标离开窗口时发送WM_MOUSELEAVE消息
      

  7.   

    你可以用SETCAPTURE()来得到鼠标,你设置完了后,你就可以在任何时候都能得到WM_MOUSEMOVE事件,退出时请用RELEASECAPTURE();绝对好使!
      

  8.   

    lnhlg(源代码) :您提到的“使用TrackMouseEvent()在鼠标离开窗口时发送WM_MOUSELEAVE消息”,如何使用?以前没听说过。Thank you!
      

  9.   

    VC6.0 中好象没有WM_MOUSELEAVE消息,ClassWizard里面也找不到!go on...
      

  10.   

    POING point
    GetCursorPos(&point)
    ScreenToClient(&point);
    CRect rect;
    AfxGetMainWnd()->GetWindowRect(&rect);
    ScreenToClient(&rect);
    if(rect.PtInRect(point))
        MessageBox("在客户区中");
      

  11.   

    POINT point
    GetCursorPos(&point)
    ScreenToClient(&point);
    CRect rect;
    AfxGetMainWnd()->GetWindowRect(&rect);
    ScreenToClient(&rect);
    if(rect.PtInRect(point))
        MessageBox("在客户区中");
      

  12.   

    要自己添加消息,下面是我的一个例子,在鼠标离开窗口时弹出一个消息框:
    我定义了一个视图类CFinanceView,在类定义文件中添加消息处理函数的声明:
    afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);然后在类实现文件中添加消息映射:
    BEGIN_MESSAGE_MAP(CFinanceView, CFormView)
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) //自己定义的消息
    END_MESSAGE_MAP()添加鼠标移动消息:
    void CFinanceView::OnMouseMove(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(TRACKMOUSEEVENT);
    //监控鼠标离开
    tme.dwFlags = TME_LEAVE;
    tme.hwndTrack = this->m_hWnd; ::_TrackMouseEvent(&tme); CFormView::OnMouseMove(nFlags, point);
    }处理鼠标离开消息
    LRESULT CFinanceView::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
    MessageBox("鼠标已离开本窗口");
    return 0;
    }
      

  13.   

    同意楼上,我也用::_TrackMouseEvent实现过类似操作。
      

  14.   

    使用_TrackMouseEvent函数可以使系统在鼠标离开窗口的时候发送一个WM_MOUSELEAVE的消息。
    使用方法:
    1、在头文件声明消息响应函数
    afx_msg void OnMouseLeave();
    2、在cpp文件定义消息响应函数
    void CIMyWin::OnMouseLeave()
    {
         MessageBox("鼠标已离开");
        m_bTrackLeave=FALSE;
    }
    3、添加消息映射
    ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
    4、调用_TrackMouseEvent();捕获鼠标离开的事件
    void CMyWin::OnMouseMove(UINT nFlags, CPoint point) 
    {
        if (!m_bTrackLeave)
        {// 鼠标第一次移入窗口时, 请求一个WM_MOUSELEAVE 消息
             TRACKMOUSEEVENT tme;
             tme.cbSize = sizeof(tme);
             tme.hwndTrack = m_hWnd;
             tme.dwFlags = TME_LEAVE;
             _TrackMouseEvent(&tme);
             m_bTrackLeave = TRUE;
        }
       CWnd::OnMouseMove(nFlags, point);
    }