• 测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留


    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留

    FMD(http://www.fmdstudio.net)

    (注:此文曾在CSDN出现过,被他人作为"原作")

    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留

    以下给出两种跟踪鼠标是否在窗口内的方法

    一、使用SetCapture(),OnMouseMove()等判断鼠标位置

    //设置一个状态量用于记录和标识鼠标是否在窗口内
    //BOOL m_bOverControl;
    void C?????::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;
    //处理鼠标移动消息
    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;
    }

    http://blog.csdn.net/fmd/article/details/5525

  • 相关阅读:
    基于 IAR 修改工程名称
    Baidu IoT Study
    msp430f5438a Information Flash Seg Write -- Chapter
    MFC 编辑框内容更新方法以及滚动条设置
    通过打开按钮打开文件和通过左键移动打开文件并计算crc
    移动文件并将文件路径显示到编辑框内
    Aritronix Virtual Device 运行
    将一个char类型的数转换成曼切斯特数
    数组中重复的数字
    平衡二叉树
  • 原文地址:https://www.cnblogs.com/findumars/p/5944047.html
Copyright © 2020-2023  润新知