SetWindowPos如何影响所有者窗口的Z顺序?

时间:2020-06-29 13:30:28

标签: windows winapi

The SetWindowPos function接受以下标志:

SWP_NOOWNERZORDER (0x0200)
不会按Z顺序更改所有者窗口的位置。

如果不传递此标志,SetWindowPos函数对所有者窗口在Z顺序中的位置会执行什么操作?

2 个答案:

答案 0 :(得分:5)

SetWindowPos函数对所有者窗口的位置有何作用 如果您不通过此标志,则按Z顺序排列?

以将拥有的窗口置于Z顺序的底部为例。有三个窗口:“ Owned”,“ TestWindowPos”(所有者)和“ New Tab Chrome”窗口(作为参考)。

测试代码段:

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   HWND hWndOwned = CreateWindowW(szWindowClass, L"Owned", WS_OVERLAPPEDWINDOW,
       0, 0, 500, 500, hWnd, nullptr, hInstance, nullptr);

   ShowWindow(hWndOwned, nCmdShow);
   UpdateWindow(hWndOwned);

   SetWindowPos(hWndOwned, HWND_BOTTOM, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER);

设置SWP_NOOWNERZORDER标志后,您可以从以下快照中看到,它将拥有的窗口置于底部,但保持所有者不变。

enter image description here

未设置SWP_NOOWNERZORDER标志时 ,您可以从以下快照中看到它更改了所有者窗口的z顺序以及所有者窗口的。 / p>

enter image description here

答案 1 :(得分:1)

我编写了一个测试程序,它以4个窗口(所有者,2个拥有的窗口和一个不相关的窗口)的每个可能的开始顺序尝试所有SetWindowPos操作。我发现了以下内容:

  • Windows倾向于将拥有的窗口直接放在其所有者的前面,而在它们之间没有任何其他窗口。

  • 同时使用SWP_NOACTIVATESWP_NOOWNERZORDER时,您可以按任意顺序放置窗口。以前的“规则”从未执行过。

  • 如果不使用SWP_NOACTIVATE,则目标窗口将变为活动。目标窗口始终移动到Z顺序的前部,因为“注释”中的文档说明-hWndInsertAfter会被忽略,特殊值除外。

    如果目标窗口是所有者窗口或所有者,则为该所有者和其所有窗口 all 实施首选的Z顺序 SWP_NOOWNERZORDER被忽略。

  • 当使用SWP_NOACTIVATE而不使用SWP_NOOWNERZORDER且目标窗口是所有者窗口或所有者时,Windows 可以决定强制实施首选窗口订购该所有者及其所有拥有的窗口。做出此决定的标准似乎如下(尽管我不会依靠它们):

    • 目标窗口是所有者,或者
    • 目标窗口已拥有并处于活动状态,或者
    • 该呼叫尝试在其所有者后面放置一个拥有的窗口