点击两个子窗口的重叠区域,为什么是底下的窗口响应鼠标事件?

bd_33481551 2015-12-23 03:27:49
Win32项目,使用Windows API注册了两个子窗口类,CreateWindow时,子窗口风格设为WS_CHILDWINDOW | WS_VISIBLE。子窗口均使用GDI填充了矩形。当鼠标点击两个窗口的重叠区域时,为什么是下面的窗口接收到鼠标事件,而不是上面的窗口接收?

通过交换两个子窗口的Z顺序后,结果还是一样,位于下面的窗口响应了鼠标点击事件。

请高手指点一二,不胜感激!
...全文
597 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bd_33481551 2016-01-23
  • 打赏
  • 举报
回复
如果看不到参考资料,自行搜索文章标题: 窗口之间的主从关系与Z-Order
bd_33481551 2016-01-23
  • 打赏
  • 举报
回复
找到原因了,是子窗口Z-Order导致的。Windows的重叠子窗口的显示顺序是最后创建的子窗口位于Z-Order的最后面,也就是最底层,但是Z-Order靠后的子窗口刷新也靠后,最终导致底层的窗口“看起来”在顶层。所以点击两个子窗口的重叠区域时,响应的是实际在顶层“看起来”在底层的窗口,也就是Z-Order在最前的窗口。 解决方法:子窗口在创建时风格参数加上WS_CLIPSIBLINGS就可以了,意思是从刷新区域中“剪切掉”被Z-Order在前的兄弟窗口覆盖的区域,这样看起来跟实际的重叠情况就吻合了。 参考资料: http://www.cnblogs.com/dhatbj/p/3288152.html http://www.th7.cn/system/win/201406/60715.shtml
schlafenhamster 2016-01-09
  • 打赏
  • 举报
回复
如果可以 上传 程序到 你的 资源, 让人 帮你 调调
bd_33481551 2016-01-09
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
上面的窗口消息处理有误。我猜。 使用Spy++软件。
不知道是不是,SPY++没用过,估计我也不会用
赵4老师 2015-12-28
  • 打赏
  • 举报
回复
上面的窗口消息处理有误。我猜。 使用Spy++软件。
bd_33481551 2015-12-24
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
窗口2 的重叠 区 是 透明 的, 鼠标会 穿透。
那个只是效果图啦,其实是完全填充的。而且,而且,不管你的图形是否透明,点击区域还是窗口的矩形区域,与图像无关。如果要做透明的穿透效果,很麻烦。
bd_33481551 2015-12-24
  • 打赏
  • 举报
回复
引用 7 楼 jennyvenus 的回复:
也许跟创建控件的顺序有关,试试改变顺序。
试过顺序了,也通过设置Z顺序测试,结果还是一样。
bd_33481551 2015-12-24
  • 打赏
  • 举报
回复
引用 3 楼 jennyvenus 的回复:
下面的要显示吗?不显示的话,隐藏了就行了。
要显示,两个窗口只是部分重叠。 而且,有可能很多窗口堆叠在一起,这时点击最上面的窗口,接收到点击事件的却是最底层的窗口。
用户 昵称 2015-12-24
  • 打赏
  • 举报
回复
下面的要显示吗?不显示的话,隐藏了就行了。
bd_33481551 2015-12-24
  • 打赏
  • 举报
回复
自己顶一下,是我的问题没说清楚吗?
bd_33481551 2015-12-24
  • 打赏
  • 举报
回复
自己顶一下,是我的问题没说清楚吗?
schlafenhamster 2015-12-24
  • 打赏
  • 举报
回复
窗口2 的重叠 区 是 透明 的, 鼠标会 穿透。
用户 昵称 2015-12-24
  • 打赏
  • 举报
回复
也许跟创建控件的顺序有关,试试改变顺序。
bd_33481551 2015-12-24
  • 打赏
  • 举报
回复
引用 5 楼 Minikinfish 的回复:
为啥要两个重叠,重叠的窗体无法实现一个覆盖另外一个的效果,除非使用BCB,
建议自己把相应的功能实现到自定义的CWnd派生窗体中。


重叠只是为了学习研究,而且绘图程序里面的图形叠加也很常见。

而我只是把图形功能封装到自定义的窗口类里面,纯API的,没有使用MFC。如果封装到CWnd类里面估计也不会有这些问题,因为MFC已经把窗口、消息都封装得很好了。

效果如下图
Minikinfish 2015-12-24
  • 打赏
  • 举报
回复
为啥要两个重叠,重叠的窗体无法实现一个覆盖另外一个的效果,除非使用BCB, 建议自己把相应的功能实现到自定义的CWnd派生窗体中。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧