关于窗口

关于win32窗口的一些细节,一段时间没用就忘了细节了,写下来备忘一下

 

每个窗口对象都有四个关联的数据,即child、sibling、parent、owner,子窗口,兄弟窗口,父窗口,拥有者窗口;

 

owner-owned

1被拥有的窗口永远显示在拥有它的那个窗口的前面;
2当所有者窗口最小化的时候,它所拥有的窗口都会被隐藏;
3当所有者窗口被销毁的时候,它所拥有的窗口都会被销毁;

4child不能是owner,owned可以是owner;

5缺省情况下,对话框和消息框属于 owned 窗口;除非在创建它们的时候明确给出了WS_CHILD属性,否则由系统负责给它们指定owner窗口;

6一旦创建了owned类型的窗口,就无法再改变其所有关系,因为WIN32没有没有提供改变窗口所有者的方法。

7隐藏owner,不会影响owned

8要注意保证父子窗口或者owner/owned 窗口要同属于一个线程;

 

 

parent-child

1父窗口提供了用来定位子窗口的坐标系统,一个子窗口只能显示在它的父窗口的客户区中,之外的部分将被裁减:

如果父窗口不可见,则子窗口肯定不可见,

如果父窗口移动到了屏幕之外,子窗口也一样,
2当父窗口被隐藏时,它的所有子窗口也被隐藏;
3父窗口被销毁的时候,它所拥有的子窗口都会被销毁;

ps:最小化parent,不会影响child

 

窗口类型

1desktop window,控制台窗口

当系统初始化的时候,它首先创建控制台窗口,大小覆盖整个屏幕;

所有其它窗口都在这个控制台窗口上面显示;

它是所有 WS_OVERLAPPED 类型窗口的所有者和父窗口;

它的下一层窗口是顶级窗口,非child、没有父窗口,或者父窗口是 desktop window,没有WS_CHILD;

 

2WS_OVERLAPPED,层叠窗口

顶级窗口,owner是desktop window;

不论是否给出了WS_CAPTION、WS_BORDER属性,这类窗口创建后都有标题栏和边框;

可以拥有其它顶级窗口或者被其它顶级窗口所拥有;

都有WS_CLIPSIBLINGS属性;

系统可以自动设置 overlapped窗口的大小和初始位置;

 

3WS_POPUP,弹出窗口

可以为顶级窗口,也可以SetParent有父窗口;

owner是在CreateWindow函数中通过设置hWndParent参数给定的,如果hWndParent不是子窗口,则该窗口就成为这个新的弹出式窗口的owner,否则,系统从hWndParent的父窗口向上找,直到找到第一个非子窗口,把它作为该弹出窗口的 owner;

当owner窗口销毁的时候,系统自动销毁这个弹出窗口;

所有弹出式窗口也都有 WS_CLIPSIBLINGS属性;

 

4WS_CHILD,子窗口

parnet相当于owner,但不是!因为child没有维护owner数据;

 

API备忘
GetWindow(hWnd, GW_OWNER)永远返回窗口的所有者(owner)。对于子窗口,函数返回 NULL,因为它们的父窗口就相当于所有者(注意,是“相当于”)。因为Windows系统没有维护子窗口的所有者信息。
MFC CWnd::SetOwner(CWnd* pOwnerWnd)  Win32没有 

GetParent

SetParent MSDN说parent和child必须为同一进程,但可以调用成功,不过结果未知;

GetWindowWord(hWnd, GWW_HWNDPARENT)返回一个窗口的父窗口,如果没有,则返回其所有者。

ShowOwnedPopups设置或者删除当前窗口所拥有的窗口的 WS_VISIBLE属性,然后发送WM_SHOWWINDOW消息更新窗口显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值