子窗口Z顺序

Icy*_*Brk 4 winapi

我在MSDN中看到,它说:

如果创建的窗口是子窗口,则其默认位置位于Z顺序的底部.如果创建的窗口是顶级窗口,则其默认位置位于Z顺序的顶部(但在所有最顶层窗口的下方,除非创建的窗口本身位于最顶层).(http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx)

但是,另一个文档说:当一个应用程序创建一个窗口时,系统将它放在同一类型窗口的z顺序的顶部 (http://msdn.microsoft.com/en-us/library/windows/ desktop/ms632599(v = vs.85).aspx)

当我像这样测试时,

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);
Run Code Online (Sandbox Code Playgroud)

新创建的子窗口(例如:我在窗口中创建了两个按钮并且它们重叠,我可以看到稍后创建的按钮覆盖了创建的第一个按钮)

MSDN中的第一个声明是否与我的测试相矛盾.

Han*_*ant 8

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

您可以通过将WS_CLIPSIBLINGS样式标志添加到CreateWindowEx调用来解决此问题.您现在将看到 "确定"按钮位于顶部.固定:

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
Run Code Online (Sandbox Code Playgroud)