测试鼠标是否在窗口内,以及鼠标的离开
以下给出两种跟踪鼠标是否在窗口内的方法一、使用SetCapture(),OnMouseMove()等判断鼠标位置//设置一个状态量用于记录和标识鼠标是否在窗口内//BOOL m_bOverControl;void C?????::OnMouseMove(UINT nFlags, CPoint point){ CStatic::OnMouseMove(nFlags, point);//如果鼠标还在窗口内if (m_bOverControl){ CRect rect;GetClientRect(rect);//鼠标位置离开了客户区,解除鼠标捕获,并改写状态量m_bOverControlif (!rect.PtInRect(point)){ m_bOverControl = FALSE;ReleaseCapture();//......//其他鼠标离开时的操作//eg: ReDrawWindow();return;}}//如果鼠标进入窗口,置鼠标捕获,状态参量else{ m_bOverControl = TRUE;////其他鼠标进入时的操作//eg: ReDrawWindow();SetCapture();}}二、使用TrackMouseEvent()在鼠标离开窗口时发送WM_MOUSELEAVE消息使用TrackMouseEvent()还可以判断鼠标的停留,并发送WM_MOUSEHOVER消息//设置一个状态量用于记录和标识鼠标是否在窗口内//BOOL m_bMouseTracking;//处理鼠标移动消息void CSomeWnd::OnMouseMove(UINT nFlags, CPoint point){ //接收到WM_MOUSEMOVE,而m_bMouseTracking为假时,鼠标进入窗口。//设置_TrackMouseEventif (!m_bMouseTracking){ TRACKMOUSEEVENT tme;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_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);//消息映射ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)//处理函数定义LRESULT CSomeWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam){ ////其他鼠标离开时的操作////重置状态量m_bMouseTracking = FALSE;return TRUE;}