4

我在 MSDN 中看到,它说:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx

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

但是,另一个文档说:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx

当应用程序创建一个窗口时,系统将它放在相同类型窗口的 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 中的第一条语句与我的测试相矛盾吗?

4

2 回答 2

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
于 2013-07-18T13:12:21.070 回答
3

您不应过多依赖子窗口的显示方式以及最后绘制的窗口。如果我运行您的示例代码,我会得到一个与取消按钮重叠的确定按钮。如果我将鼠标移到按钮上,那么 OK 按钮将进入前景并绘制在 Cancel 按钮上。

我曾经在重叠子控件方面遇到过类似的问题。然后我发现微软说Windows 不支持重叠控件

顺便说一句,如果您真的想查看 Z 顺序,请使用GetTopWindowand GetNextWindow。或者更简单的方法:运行Microsoft Spy++

于 2013-07-18T12:10:55.557 回答