有这么一个简单的问题
搞了这么久的Windows开发,我依然会频繁地对这个问题比较茫然:什么是一个顶级(top-level)窗口?
那,今天就来叨叨一下。
一个top-level窗口是一个不是子窗口的窗口(绕口令来了)。说白了,就是说,这个窗口不带有WM_CHILD属性。
更多解析
> top-level窗口和子窗口不同,一个top-level窗口可以被显示在屏幕的任何位置,而子窗口一般只能显示在它的父窗口的客户区。
> 有很多文档里定义top-level窗口为:一个没有父窗口的窗口。这个说法可能到导致某种误解:很多人认为使用CreateWindow(Ex)并传递一个有效的父窗口句柄可以创建一个”有父窗口”的窗口。如果根据这个定义,则这个窗口就不是一个top-level窗口。
> 一个top-level窗口可以被或者不被拥有,但是它永远也不可能是一个子窗口。我们可以说一个窗口有一个拥有者,但是它没有一个父窗口。
> top-level窗口可以是一个重叠(Overlapped)窗口(带有WS_OVERLAPPED属性,通常作为应用程序主窗口), 也可以是一个弹出式窗口(带有WM_POPUP属性,通常用于各类弹出消息框)。
> 一些涉及窗口操作的API如CreateWindow(Ex), MoveWindow, SetWindowPos,总是使用屏幕坐标系(左边原点位于屏幕左上角)。
俩例子儿
下面创建了一个top-level窗口,因为它没有设置WM_CHILD属性。同时,它没有设置父窗口,所以它没有被拥有。
下面也是创建了一个top-level窗口,因为它没有设置WM_CHILD属性。同时,它设置了父窗口,所以它被这个父窗口所拥有。
总结
经过这么一番咀嚼,应该是搞明白什么是一个top-level窗口了吧?
今日份叨叨完毕。
最后
本文来自”代码大拿”(CodeGuru):《Windows SDK: What is a top-level window?》