【MFC/win32实战】 继承CWnd实现的一个tip显示问题收集

tip常见测试手段:
[
1.tip跑到父窗口外边,鼠标从tip超过父窗口的那一侧离开,看是否消失
2.提前放一个窗口在tip会显示一半的地方,然后tip显示后,从tip移到放置的窗口,看tip是否消失
3.按快捷键,看tip是否消失,如alt+tab,父窗口可能存在按快捷键,父窗口隐藏了,此时怎么处理?
4.tip会延时显示的,鼠标放到触发显示的地方,按右键等提前显示菜单或其他窗口,然后tip还应该显示吗?
]

------
1.tip跑到父窗口外边,鼠标从tip超过父窗口的那一侧离开,看是否消失
[
不消失解决办法:
头文件:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnMouseLeave();

cpp文件:
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()

void CMyWnd::OnMouseMove(UINT nFlags, CPoint point)
{
    TRACKMOUSEEVENT    tme;
    tme.cbSize = sizeof(TRACKMOUSEEVENT);
    tme.dwFlags = TME_LEAVE;
    tme.dwHoverTime = 0;
    tme.hwndTrack = this->m_hWnd;
    ::_TrackMouseEvent(&tme);

    return __super::OnMouseMove(nFlags, point);
}

void CMyWnd::OnMouseLeave()
{
    ShowWindow(SW_HIDE);

    return __super::OnMouseLeave();
}
]

---
2.提前放一个窗口在tip会显示一半的地方,然后tip显示后,从tip移到放置的窗口,看tip是否消失
[
不消失可能原因:里面有子控件,鼠标放到了子控件上,离开时是从子控件离开到另一个窗口,
所以消息都被子控件处理了,此时可以让子控件给父窗口发送鼠标离开消息,让窗口消失

]

---
3.继承CWnd实现的一个tip显示后在按下alt+tab后跑到前面不消失了,或者别的窗口可以夹在tip和父窗口中间怎么办?
[
处理方式1:
一般是因为创建窗口是WS_EX_TOPMOST导致的,解决办法是换成WS_EX_TOOLWINDOW

[
看创建窗口时填入的窗口的风格

bool CWndInfo::CreateInfoWindow(HWND hWnd)
{
    m_hWndParent = hWnd;

    CString strWndClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)(COLOR_3DFACE + 1));
    CreateEx(WS_EX_TOPMOST, strWndClass, NULL, WS_POPUP, CRect(0, 0, 0, 0), FromHandle(hWnd), 0);
    return true;
}

CreateEx函数的第一个参数:
WS_EX_TOPMOST             --顶层窗口,会导致窗口始终显示在最顶层,别的窗口可以拖动到此窗口和此窗口的父窗口中间,
                                           父窗口消失了或者按alt+tab导致别的窗口完全遮住了父窗口,此窗口依然会显示
WS_EX_TOOLWINDOW     --没有任务栏、托盘图标,跟随父窗口一起显示、消失
]
]

处理方式2:
处理按键消息:按任何一个按键,直接消失
virtual BOOL PreTranslateMessage(MSG* pMsg);

BOOL CMyWnd::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
    {
        if (this->IsWindowVisible())
        {
            ShowWindow(SW_HIDE);
            return TRUE;
        }
    }
    return __super::PreTranslateMessage(pMsg);
}

注意:此函数响应的条件是此窗口必须获得焦点,所以显示时如果未获得焦点就要加SetFocus()
m_pMyWnd->ShowWindow(SW_SHOW);
m_pm_pMyWnd->SetFocus();

---
4.tip会延时显示的,鼠标放到触发显示的地方,按右键等提前显示菜单或其他窗口,然后tip还应该显示吗?

通过定时器显示的,此时不应该显示比较好,方法是在定时器达到后,显示前判断一下是否获得焦点,被抢了焦点就隐藏,
因为被抢了焦点,此时PreTranslateMessage不会响应

void CMyWndI::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == TIMER_ID_SHOW)
    {
        if (m_bHaveTimer)
        {
            KillTimer(TIMER_ID_SHOW);
            m_bHaveTimer = false;
        }

        //如果被其他窗口抢焦点了不显示
        if (this->GetFocus() != this)
        {
            return;
        }
        
        MoveWnd(m_pointShow);
        return;
    }

    return __super::OnTimer(nIDEvent);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值