识海日志——时间都去哪了(20140306)

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

结论:

也就是说,我们看到在前面(近处)的控件得不到鼠标消息,覆盖在后面(远处)的控件可以截获鼠标消息。

视觉顺序,和消息响应顺序相反!

这个和常规思维有冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值