Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 子窗口Z阶_Winapi - Fatal编程技术网

Winapi 子窗口Z阶

Winapi 子窗口Z阶,winapi,Winapi,我在MSDN中看到,它说: 如果创建的窗口是子窗口,则其默认位置位于Z顺序的底部。如果创建的窗口是顶层窗口,则其默认位置位于Z顺序的顶部(但在所有最顶层窗口下方,除非创建的窗口本身是最顶层)。 () 然而,另一份文件说: 当应用程序创建一个窗口时,系统将其置于相同类型窗口的z顺序顶部 () 当我这样测试时 btn1 = ::CreateWindow(L"button", L"OK", WS_TABSTOP|BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD

我在MSDN中看到,它说:

如果创建的窗口是子窗口,则其默认位置位于Z顺序的底部。如果创建的窗口是顶层窗口,则其默认位置位于Z顺序的顶部(但在所有最顶层窗口下方,除非创建的窗口本身是最顶层)。 ()

然而,另一份文件说: 当应用程序创建一个窗口时,系统将其置于相同类型窗口的z顺序顶部 ()

当我这样测试时

btn1 = ::CreateWindow(L"button", L"OK", WS_TABSTOP|BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD
                    , 10, 10, 50, 30, hWnd, (HMENU)51, hInst, NULL);
btn2 = ::CreateWindow(L"button", L"Cancel", WS_TABSTOP|WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE
                    , 20, 20, 70, 30, hWnd, (HMENU)52, hInst, NULL);
新创建的子窗口(例如:我在一个窗口中创建了两个按钮,它们重叠,我可以看到后面创建的按钮覆盖了创建的第一个按钮)


MSDN中的第一条语句是否与我的测试相矛盾。

您不应该过分依赖子窗口的显示方式以及最后绘制的子窗口。如果我运行您的示例代码,我会得到一个OK按钮,该按钮与Cancel按钮重叠。如果我把鼠标移到按钮上,OK按钮就会出现在前台,并画在Cancel按钮上

我曾经在重叠的儿童控制方面遇到过类似的问题。然后我发现微软说


顺便说一句,如果您确实想查看Z顺序,那么使用
GetTopWindow
GetNextWindow
。或者更简单的方法:运行
MicrosoftSpy++

文档准确无误。您正被另一个问题绊倒,您允许子窗口在其他子窗口之间绘制自己。所以现在绘画顺序很重要

您可以通过向CreateWindowEx调用添加WS_ClipSpilings样式标志来修复此问题。现在您将看到OK按钮位于顶部。修正:

btn1 = ::CreateWindow(L"button", L"OK", 
           WS_TABSTOP|BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS,
           10, 10, 50, 30, hWnd, (HMENU)51, hInst, NULL);
// etc, use it as well on other child windows