前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >窗口之间Parent和Own关系的区别

窗口之间Parent和Own关系的区别

作者头像
gaigai
发布2019-12-04 11:55:57
1.2K0
发布2019-12-04 11:55:57
举报
文章被收录于专栏:Windows开发Windows开发

窗口之间Parent和Own关系有本质上区别,平常都简单叫做父子关系,其实是错误的。

Parent关系(Parent-Child)叫做父子关系,比如对话框窗口与对话框内部的控件之间的关系就是Parent关系,其特点:

第一,Child窗口在创建时带有WS_CHILD属性

第二,Child窗口的生命周期不会超过Parent窗口的生命周期,也就是说Parent窗口销毁的时候,Child窗口也随即销毁

第三,Child窗口的展示区域不会超过Parent窗口的客户区域,MoveWindow()、SetWindowPos()等涉及窗口位置的API,其左上角坐标(x,y)都是相对于Parent窗口的客户区域。

第四,毫无疑问,Child窗口一定是显示在Parent窗口之上,Parent窗口显示时Child显示,Parent窗口隐藏时Child隐藏。

Own关系(Own-Owned)叫做拥有关系,拥有关系的两个窗口,准确说不能叫父子窗口,而是叫拥有窗口和被拥有窗口,他们都是WS_POPUP或WS_OVERLAPPED窗口,比如程序的主窗口和桌面就是Own关系,其特点:

第一,Owned窗口在创建时带有WS_POPUP或WS_OVERLAPPED属性

第二,Owned窗口和Own窗口的生命周期是独立的,Own窗口销毁的时候,Owned窗口不会自动销毁,可以修改其Own窗口

第三,Owned窗口的显示区域是全屏,跟Own窗口的显示区域没有任何关系,MoveWindow()、SetWindowPos()等涉及窗口位置的API,其左上角坐标(x,y)都是相对于屏幕左上角。

第四,Owned窗口显示Own窗口之上,这是为什么要建立Own关系的重要原因,Own窗口显示隐藏不影响Owned窗口的显示状态。

Parent关系中Parent窗口管理Child窗口的状态,Own关系中Own窗口和Owned窗口彼此独立,为了让Owned窗口能显示在Own窗口之上于是建立Own关系。

CreateWindow() API中的参数hWndParent,虽然参数名称带有Parent,其实当dwStyle带有WS_POPUP或WS_OVERLAPPED时是指定Own窗口。

一般,在CreateWindow()时都会指定Parent窗口或Own窗口,但极个别场景下需要修改Parent或Own窗口时,可以使用SetParent() API修改Parent窗口,使用SetWindowLong()API指定GWL_HWNDPARENT修改Own窗口。如果原窗口是POPUP或OVERLAPPED窗口调用SetParent()API时会建立Parent关系,但出于兼容考虑SetParent()内部还是保留原窗口属性(未修改为WS_CHILD),所以SPY++查看窗口STYLE时会发现不是WS_CHILD,这是正常的。

选择使用Parent关系还是Own关系,笔者建议:

第一,如果只是为了解决窗口层级问题,两种关系都可以,那么优先选择Parent关系,因为Parent窗口会管理Child窗口,自动销毁Child窗口。

第二,判断窗口的显示范围,如果希望独立可以在全屏上自由移动展示就选择Own关系,如果希望限制在某个窗口内就选择Parent关系。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档