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);
}