关于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消息更新窗口显示。