DeferWindowPos 函数 (winuser.h)

汇报指定的多窗口 - 指定窗口的位置结构。 然后,函数返回更新结构的句柄。 EndDeferWindowPos 函数使用此结构中的信息同时更改多个窗口的位置和大小。 BeginDeferWindowPos 函数创建 结构。

语法

HDWP DeferWindowPos(
  [in]           HDWP hWinPosInfo,
  [in]           HWND hWnd,
  [in, optional] HWND hWndInsertAfter,
  [in]           int  x,
  [in]           int  y,
  [in]           int  cx,
  [in]           int  cy,
  [in]           UINT uFlags
);

参数

[in] hWinPosInfo

类型: HDWP

多窗口的句柄 - 包含一个或多个窗口的大小和位置信息的位置结构。 此结构由 BeginDeferWindowPos 或最近调用 DeferWindowPos 返回。

[in] hWnd

类型:HWND

结构中存储更新信息的窗口的句柄。 多窗口 - 位置结构中的所有窗口必须具有相同的父级。

[in, optional] hWndInsertAfter

类型:HWND

一个窗口的句柄,该句柄位于 Z 顺序的定位窗口之前。 此参数必须是窗口句柄或以下值之一。 如果在 uFlags 参数中设置了SWP_NOZORDER标志,则忽略此参数。

含义
HWND_BOTTOM
( (HWND) 1)
Places Z 顺序底部的窗口。 如果 hWnd 参数标识最顶部的窗口,该窗口将失去其最顶部的状态,并放置在所有其他窗口的底部。
HWND_NOTOPMOST
( (HWND) -2)
Places所有非最顶部窗口上方的窗口 (,即所有最顶部的窗口) 的后面。 如果窗口已经是非最顶部窗口,则此标志不起作用。
HWND_TOP
( (HWND) 0)
Places Z 顺序顶部的窗口。
HWND_TOPMOST
( (HWND) -1)
将窗口置于所有非最顶部窗口的上面。 该窗口即使已停用,也会保留在最高位置。

[in] x

类型: int

窗口左上角的 x 坐标。

[in] y

类型: int

窗口左上角的 y 坐标。

[in] cx

类型: int

窗口的新宽度(以像素为单位)。

[in] cy

类型: int

窗口的新高度(以像素为单位)。

[in] uFlags

类型: UINT

影响窗口大小和位置的以下值的组合。

含义
SWP_DRAWFRAME
0x0020
在窗口的类说明) 围绕窗口绘制 (定义的框架。
SWP_FRAMECHANGED
0x0020
向窗口发送 WM_NCCALCSIZE 消息,即使窗口的大小未更改也是如此。 如果未指定此标志,则仅在更改窗口大小时发送 WM_NCCALCSIZE
SWP_HIDEWINDOW
0x0080
隐藏窗口。
SWP_NOACTIVATE
0x0010
不激活窗口。 如果未设置此标志,则会激活窗口并将其移动到最顶部或非最顶部组 (的顶部,具体取决于 hWndInsertAfter 参数) 的设置。
SWP_NOCOPYBITS
0x0100
丢弃工作区的整个内容。 如果未指定此标志,则会在调整窗口大小或重新定位后保存工作区的有效内容并将其复制回工作区。
SWP_NOMOVE
0x0002
保留当前位置 (忽略 xy 参数) 。
SWP_NOOWNERZORDER
0x0200
不更改所有者窗口在 Z 顺序中的位置。
SWP_NOREDRAW
0x0008
不重绘更改。 如果设置了此标志,则不执行任何形式的重绘。 这适用于工作区、非工作区 (包括标题栏和滚动条) ,以及由于窗口移动而发现父窗口的任何部分。 设置此标志后,应用程序必须显式使需要重绘的窗口和父窗口的任何部分失效或重绘。
SWP_NOREPOSITION
0x0200
SWP_NOOWNERZORDER 标志相同。
SWP_NOSENDCHANGING
0x0400
阻止窗口接收 WM_WINDOWPOSCHANGING 消息。
SWP_NOSIZE
0x0001
保留当前大小 (忽略 cxcy 参数) 。
SWP_NOZORDER
0x0004
保留当前 Z 顺序 (忽略 hWndInsertAfter 参数) 。
SWP_SHOWWINDOW
0x0040
显示“接收端口跟踪选项” 窗口。

返回值

类型: HDWP

返回值标识更新的多窗口 - 位置结构。 此函数返回的句柄可能与传递给函数的句柄不同。 下一次调用 DeferWindowPosEndDeferWindowPos 函数时,应传递此函数返回的新句柄。

如果系统资源不足,函数无法成功,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

注解

如果对 DeferWindowPos 的调用失败,应用程序应放弃窗口定位操作,而不是调用 EndDeferWindowPos

如果未指定SWP_NOZORDER,系统会将 hWnd 参数标识的窗口放在 hWndInsertAfter 参数标识的窗口之后的位置。 如果 hWndInsertAfterNULLHWND_TOP,系统会将 hWnd 窗口置于 Z 顺序的顶部。 如果 hWndInsertAfter 设置为 HWND_BOTTOM,系统会将 hWnd 窗口置于 Z 顺序的底部。

子窗口的所有坐标都相对于父窗口工作区的左上角。

通过将 hWndInsertAfter 设置为 HWND_TOPMOST 标志并确保未设置 SWP_NOZORDER 标志,或者将窗口的位置设置为 Z 顺序,使其位于任何现有最顶部窗口之上,可以将窗口设置为最顶部窗口。 当非最顶部窗口成为最顶部窗口时,它拥有的窗口也将成为最顶部窗口。 但是,其所有者不会更改。

如果 SWP_NOACTIVATESWP_NOZORDER 标志均未指定 (即,当应用程序请求同时激活窗口且其 Z 顺序中的位置) 更改时, hWndInsertAfter 中指定的值仅在以下情况下使用:

  • hWndInsertAfter 中未指定 HWND_TOPMOSTHWND_NOTOPMOST 标志。
  • hWnd 标识的窗口不是活动窗口。
应用程序无法激活非活动窗口,而无需同时将其置于 Z 顺序的顶部。 应用程序可以不受限制地更改已激活窗口在 Z 顺序中的位置,也可以激活窗口,然后将其移动到最顶部或非最顶部窗口的顶部。

如果最顶层窗口重新定位到 Z 顺序的底部 (HWND_BOTTOM) 或任何非最顶部窗口之后,则它将不再是最顶部窗口。 当最顶部的窗口成为非最顶部窗口时,其所有者及其拥有的窗口也成为非最顶部的窗口。

非最顶部窗口可以拥有最顶部窗口,但反之则不然。 由最顶部窗口拥有的任何窗口(例如对话框)本身将变成最顶部窗口,以确保所有被拥有的窗口位于其所有者之上。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll
API 集 Windows 10版本 10.0.14393 中引入的 ext-ms-win-ntuser-window-l1-1-4 ()

另请参阅

BeginDeferWindowPos

概念性

EndDeferWindowPos

引用

ShowWindow

Windows