The SetWindowPos
function接受以下标志:
SWP_NOOWNERZORDER (0x0200)
不会按Z顺序更改所有者窗口的位置。
如果不传递此标志,SetWindowPos
函数对所有者窗口在Z顺序中的位置会执行什么操作?
答案 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
标志后,您可以从以下快照中看到,它将拥有的窗口置于底部,但保持所有者不变。
未设置SWP_NOOWNERZORDER
标志时 ,您可以从以下快照中看到它更改了所有者窗口的z顺序以及所有者窗口的。 / p>
答案 1 :(得分:1)
我编写了一个测试程序,它以4个窗口(所有者,2个拥有的窗口和一个不相关的窗口)的每个可能的开始顺序尝试所有SetWindowPos操作。我发现了以下内容:
Windows倾向于将拥有的窗口直接放在其所有者的前面,而在它们之间没有任何其他窗口。
同时使用SWP_NOACTIVATE
和SWP_NOOWNERZORDER
时,您可以按任意顺序放置窗口。以前的“规则”从未执行过。
如果不使用SWP_NOACTIVATE
,则目标窗口将变为活动。目标窗口始终移动到Z顺序的前部,因为“注释”中的文档说明-hWndInsertAfter
会被忽略,特殊值除外。
如果目标窗口是所有者窗口或所有者,则为该所有者和其所有窗口 all 实施首选的Z顺序 。 SWP_NOOWNERZORDER
被忽略。
当使用SWP_NOACTIVATE
而不使用SWP_NOOWNERZORDER
且目标窗口是所有者窗口或所有者时,Windows 可以决定强制实施首选窗口订购该所有者及其所有拥有的窗口。做出此决定的标准似乎如下(尽管我不会依靠它们):