MFC鼠标悬停与离开

鼠标悬停与离开

说明: MFC默认的情况下,是不会触发鼠标悬停和离开的消息。

手动添加输小悬停和离开消息及消息处理函数

  1. 声明并定义函数(其中IDC_ BUTTON_ OK为目标按钮,IDC_ EDIT_ DEST为任意Edit控件,只为转移焦点)

    LRESULT xxxDlg::OnMouseLeave(WPARAM Wparam, LPARAM lParam)
    {
        // TODO:  在此添加消息处理程序代码和/或调用默认值
        POINT p;
        GetCursorPos(&p);
        CWnd *hwnd;
        hwnd = WindowFromPoint(p);
        CWnd *hWndOk = GetDlgItem(IDC_BUTTON_OK);
        if (hWndOk == hwnd)
        {
            GetDlgItem(IDC_BUTTON_OK)->SetFocus();
            m_bEditHover = FALSE;
        }
        m_bTracking = TRUE;
        return 0;
    }
    
    
    LRESULT xxxDlg::OnMouseHover(WPARAM Wparam, LPARAM lParam)
    {
        // TODO:  在此添加消息处理程序代码和/或调用默认值
        GetDlgItem(IDC_STATIC)->SetFocus();
        if (m_bEditHover)
        {
            GetDlgItem(IDC_EDIT_DEST)->SetFocus();
        }
        m_bTracking = FALSE;
        return 0;
    }
    
  2. 利用框架添加鼠标移动消息

    void CChoseWay::OnMouseMove(UINT nFlags, CPoint point)
    {
        // TODO:  在此添加消息处理程序代码和/或调用默认值
        if (m_bTracking)
        {
            TRACKMOUSEEVENT tme;
            tme.cbSize = sizeof(TRACKMOUSEEVENT);
            tme.dwFlags = TME_LEAVE | TME_HOVER;
            tme.hwndTrack = this->m_hWnd;
            tme.dwHoverTime = 100;
            if (::_TrackMouseEvent(&tme))
            {
                m_bTracking = FALSE;
            }
        }
        CDialogEx::OnMouseMove(nFlags, point);
    }
    

    tme.dwHoverTime = 100,意为停在按钮上100ms才会触发悬停消息。

  3. 手动添加消息响应

    BEGIN_MESSAGE_MAP(CChoseWay, CDialogEx)
        ON_BN_CLICKED(IDC_BUTTON_OK, &CChoseWay::OnBnClickedButton1)
        ...
        ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
        ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
        ON_WM_MOUSEMOVE()
    END_MESSAGE_MAP()
    
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值