这个定义是正确的,但只是个我们认知上的概念的问题,因为 popup 和 child 窗口也同样可
以 拥 有 这 些 ( 后 面 证 明 ) 。 由 于 WS_OVERLAPPED 为 0 , 那 我 们 是 不 是 可 以 把
WS_OVERLAPPEDWINDOW 定义中的 WS_OVERLAPPED 拿掉呢?那是肯定的,那也就
是说 WS_OVERLAPPED 什么都不是!我们只作 popup 和 child 的区分,是不是这样?也不
是,我们继续实验。
很简单,接下去我们只给这个向导生成的代码加一点点东西,就是把 CreateWindow 改成:
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW|WS_POPUP,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
对,给窗口风格增一个 popup 风格,看看会怎么样?运行!这回可不得了,窗口缩到了屏
幕的左上角,并且宽度高度都变为了最小,当然,你还是可以用鼠标拖动窗口边缘来调整
它的大小的。如图:
图 4
这是为什么呢?观察 CreateWindow 的,第四、第五、第六和第七参数,分别为窗口的 x 坐
标,y 坐标,宽度,和高度,CW_USEDEFAULT 被 define 成 0,所以窗口被缩到左上角去
也就不奇怪了,可没有 popup,光是 overlapped 风格的窗口,为什么不会缩呢?看 MSDN
的说明,对第四个参数的说明:“ If this parameter is set to CW_USEDEFAULT, the system
selects the default position for the window's upper-left corner and ignores the y parameter.
CW_USEDEFAULT is valid only for overlapped windows; if it is specified for a pop-up or child
window, the x and y parameters are set to zero. ”其余几个参数也有类似的描述,这说明了什
么?说明 Windows 对 overlapped 和 popup 还是作区分的,而这点,算是我们发现的第一个
不同。哦,还有件事情,就是用 spy++观察其风格,发现其确实多了一个 WS_POPUP,其
余没什么变化。
继续,这回还是老地方,把 WS_POPUP 改为 WS_CHILD,试试看,这回创建窗口失败了,
返回 0,用 GetLastError 查看具体错误信息,得到的是:“1406:无法创建最上层子窗口。”看
来桌面是不让我们随便搞的。继续,还是老地方,这回改成:
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW|WS_POPUP|
WS_CHILD, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
嗯?有没搞错,又是 popup 又是 child,肯定不能成功吧,不试不知道,居然成功了,这个
创建出来的窗口乍一看,跟 popup 风格的很像,但用起来有些怪异,比如:当它被别的窗
口挡住的时候,不能通过点击它的客户区来让它显示在前面,即使点击它的标题栏,也是
要松开鼠标左键,它才能显示在前面,还有就是用 spy++的“瞄准器”没法准确捕捉到这个窗
口 , 瞄 准 器 对 准 它 的 时 候 , 就 显 示 Caption 为 “ Program Manager” , class 为
“Program”,“ Program Manager”是什么?其实就是我们所看到的这个桌面(注意,不是桌
面,我说的是我们说“看到的桌面”,就是显示桌面图标的这个所能看到的桌面窗口,和前
面提到的桌面窗口是有区别的)的父窗口的父窗口,这个窗口一般情况下是不能直接“瞄
评论9
最新资源