mfc 一个关于子窗口相互覆盖下的消息响应的问题

来源:互联网 发布:顺序循环队列c语言 编辑:程序博客网 时间:2024/06/05 08:06

首先我简要描述下问题:

一个父窗口拥有多个子窗口(都有WS_CHILD属性),这些子窗口都是动态创建出来的,

当他们有交叉时,我们操作在上面的子窗口,上面的子窗口却无法响应,反而是下面的窗口

响应了次消息。

如下图所示:


简要说明:红色为先创建的窗口,绿色为后创建的窗口


解决方案及步骤:

首先以为是窗口层次(即Z轴)的原因,于是通过调整窗口的层次,结果,还是没有解决问题。


其次 考虑到是窗口刷新的问题,发现也不是这样的。

于是网上搜索一些资料及查看MSDN,终于找到了一个有用的线索:

在创建子窗口时,会默认产生Z轴序列,且依次增大,

其绘制顺序就是Z轴的顺序(从小到大),

当他们(窗口或控件)叠加时,事件响应顺序相反(从大到小)。

知道了问题的根源,就可以对症下药了:

1)可以使用窗口属性中的CLIP_SIBLING,这个标志位可以组织兄弟窗口重叠区域重绘,这样可以使窗口显示和响应

相对应,但是显示结果却变为Z轴从大到小显示,有点违背了Windows的原则(显示的结果按照Z轴顺序从小到大绘制)。

应使用2)进行调整Z轴顺序,从而使显示顺序与Z轴顺序一致

2)使用SetWindowPos 设置窗口正确的Z轴顺序



0 0
原创粉丝点击