现在的位置: 首页 > 综合 > 正文

两种跟踪鼠标是否在窗口内的方法

2013年04月30日 ⁄ 综合 ⁄ 共 2809字 ⁄ 字号 评论关闭

以下给出两种跟踪鼠标是否在窗口内的方法  
   
  一、使用SetCapture(),OnMouseMove()等判断鼠标位置  
   
  //设置一个状态量用于记录和标识鼠标是否在窗口内  
  //BOOL   m_bOverControl;  
  void   CXXX::OnMouseMove(UINT   nFlags,   CPoint   point)  
  {  
          CStatic::OnMouseMove(nFlags,   point);  
          //如果鼠标还在窗口内  
          if   (m_bOverControl)  
                {  
                    CRect   rect;  
                    GetClientRect(rect);   //鼠标位置离开了客户区,解除鼠标捕获,并改写状态量m_bOverControl  
                    if   (!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   =   FALSE;  
  //处理鼠标移动消息  
  void   CSomeWnd::OnMouseMove(UINT   nFlags,   CPoint   point)  
  {  
  //接收到WM_MOUSEMOVE,而m_bMouseTracking为假时,鼠标进入窗口。  
  //设置_TrackMouseEvent  
          if   (!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;  
  }  
   
   
  =============================================================================================================  
  处理鼠标离开窗口的消息   (WM_MOUSELEAVE)  
  WM_MOUSELEAVE   是鼠标离开窗口时发出的消息,但是这个消息与普通的鼠标消息不同,要收到WM_MOUSELEAVE消息必须先调用TrackMouseEvent,并且每调用一次TrackMouseEvent   窗口只能收到一次WM_MOUSELEAVE,也就说如果要获得WM_MOUSELEAVE消息的话,当鼠标重新进入窗口时必须调用一次TrackMouseEvent。  
   
  static   BOOL   bTrackLeave=FALSE;  
  void   CMyWnd::OnMouseMove(UINT   nFlags,   CPoint   point)  
  {  
  if   (!bTrackLeave)  
  {  
                //   鼠标第一次移入窗口时,   请求一个WM_MOUSELEAVE   消息  
                  TRACKMOUSEEVENT   tme;  
                  tme.cbSize   =   sizeof(tme);  
                  tme.hwndTrack   =   m_hWnd;  
                  tme.dwFlags   =   TME_LEAVE;  
                  _TrackMouseEvent(&tme);  
                  bTrackLeave   =   TRUE;  
                              //   在这里添加处理鼠标进入的代码   :  
                              ………………………………  
          }  
  }  
   
  手工添加消息映射和消息处理函数  
  BEGIN_MESSAGE_MAP(CMyWnd,   CWnd)  
                //{{AFX_MSG_MAP(CMyWnd)  
                ………………………  
                //}}AFX_MSG_MAP  
                ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)  
  END_MESSAGE_MAP()  
   
  LPARAM   CMyWnd::OnMouseLeave(WPARAM   wp,   LPARAM   lp)  
  {  
  bTrackLeave   =   FALSE;  
  //   在这里添加处理鼠标离开的代码   :  
  …………………………………..  
        return   0;  
  }

抱歉!评论已关闭.