DeferWindowPos 函数 (winuser.h)

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

Syntax

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标志,则忽略此参数。

价值 Meaning
HWND_BOTTOM
(HWND)1)
将窗口置于 Z 顺序的底部。 如果 hWnd 参数标识最顶层的窗口,窗口将丢失其最顶层的状态,并放置在所有其他窗口的底部。
HWND_NOTOPMOST
((HWND)-2)
将窗口置于所有非顶部窗口上方(即位于最顶部窗口后面)。 如果窗口已是非最顶层的窗口,则此标志不起作用。
HWND_TOP
(HWND)0)
将窗口置于 Z 顺序的顶部。
HWND_TOPMOST
((HWND)-1)
将窗口置于所有非顶部窗口上方。 即使在停用窗口时,窗口仍保持其最顶层的位置。

[in] x

类型:int

窗口左上角的 x 坐标。

[in] y

类型:int

窗口左上角的 y 坐标。

[in] cx

类型:int

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

[in] cy

类型:int

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

[in] uFlags

类型: UINT

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

价值 Meaning
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_NOACTIVATE 也没有 SWP_NOZORDER 标志(即当应用程序请求同时激活窗口及其在 Z 顺序中的位置发生更改时),则 hWndInsertAfter 中指定的值仅在以下情况下使用:

  • hWndInsertAfter 中未指定HWND_TOPMOST标志和HWND_NOTOPMOST标志。
  • hWnd 标识的窗口不是活动窗口。
应用程序无法激活非活动窗口,也不会将其置于 Z 订单的顶部。 应用程序可以在 Z 顺序中更改已激活窗口的位置,且不受限制,也可以激活窗口,然后将其移动到最顶部或最顶层窗口的顶部。

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

非最顶层的窗口可能拥有最顶层的窗口,但反之亦然。 任何窗口(例如,由最顶端窗口拥有的对话框)本身都是一个最顶层的窗口,以确保所有拥有的窗口都保持在其所有者之上。

要求

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

另请参阅

BeginDeferWindowPos

概念

EndDeferWindowPos

引用

ShowWindow

Windows操作系统