Chapter 2 VC/MFCStatic控件叠加显示与消息响应顺序
今天在做人机交互的时候,发现一些匪夷所思的问题。
需求:是两个Static控件叠加,并且处在前面的Static控件响应鼠标消息。
甄别概念:
CWnd::wndBottom 位于“底层”,我们能看到的最“前面(近处)”的控件
CWnd::wndTop 位于“顶层”,我们能看不到的最“后面(远处)”的控件
代码:
OnInitDialog()内:
CRect rtRightCtrl;
m_st_ctlMouseTest.m_iNo = 1;
m_st_ctlMouseTest2.m_iNo = 2;
m_st_ctlMouseTest.SetWindowText(_T("This is a [CMouseTestStatic Control No=1]"));
m_st_ctlMouseTest2.SetWindowText(_T("This is a [CMouseTestStatic Control No=2]"));
m_st_ctlMouseTest.GetClientRect(rtRightCtrl);
rtRightCtrl.MoveToXY(0,10);
m_st_ctlMouseTest.MoveWindow(rtRightCtrl);
rtRightCtrl.MoveToXY(0,80);
m_st_ctlMouseTest2.MoveWindow(rtRightCtrl);
//m_st_ctlMouseTest.SetWindowPos(&m_st_ctlMouseTest2,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); //测试一代码××××××××××××××××
m_st_ctlMouseTest2.SetWindowPos(&m_st_ctlMouseTest,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); //测试二代码××××××××××××××××
CStatic 派生类 CMouseTestStatic:
void CMouseTestStatic::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle(0, SS_NOTIFY); //Static派生类只有添加了SS_NOTIFY属性才能接收鼠标消息。CButton派生类不用。GetCapture() SetCapture();
CStatic::PreSubclassWindow();
}
void CMouseTestStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
TRACE("CMouseTestStatic No=%d Mouse Move\n",m_iNo);
}
操作:
1.执行测试一代码后,m_st_ctlMouseTest覆盖于m_st_ctlMouseTest2前面,但是鼠标移动消息响应结果为:CMouseTestStatic No=2
2.执行测试一代码后,m_st_ctlMouseTest2覆盖于m_st_ctlMouseTest前面,但是鼠标移动消息响应结果为:CMouseTestStatic No=1
结论:
也就是说,我们看到在前面(近处)的控件得不到鼠标消息,覆盖在后面(远处)的控件可以截获鼠标消息。
视觉顺序,和消息响应顺序相反!
这个和常规思维有冲突。