SetWindowPos 函数 (winuser.h)
更改子窗口、弹出窗口或顶级窗口的大小、位置和 Z 顺序。 这些窗口根据屏幕上的外观进行排序。 最上面的窗口接收最高排名,是 Z 顺序中的第一个窗口。
语法
BOOL SetWindowPos(
[in] HWND hWnd,
[in, optional] HWND hWndInsertAfter,
[in] int X,
[in] int Y,
[in] int cx,
[in] int cy,
[in] UINT uFlags
);
参数
[in] hWnd
类型:HWND
窗口的句柄。
[in, optional] hWndInsertAfter
类型:HWND
在 Z 顺序中定位窗口之前窗口的句柄。 此参数必须是窗口句柄或以下值之一。
有关如何使用此参数的详细信息,请参阅以下“备注”部分。
[in] X
类型: int
窗口左侧的新位置,以客户端坐标表示。
[in] Y
类型: int
窗口顶部的新位置,以客户端坐标表示。
[in] cx
类型: int
窗口的新宽度(以像素为单位)。
[in] cy
类型: int
窗口的新高度(以像素为单位)。
[in] uFlags
类型: UINT
窗口大小调整和定位标志。 此参数可以是以下值的组合。
Value | 含义 |
---|---|
|
如果调用线程和拥有窗口的线程附加到不同的输入队列,系统会将请求发布到拥有该窗口的线程。 这可以防止调用线程阻止其执行,而其他线程处理请求。 |
|
阻止生成 WM_SYNCPAINT 消息。 |
|
绘制在窗口的类说明中定义的框架 () 窗口周围。 |
|
使用 SetWindowLong 函数应用设置的新框架样式。 将 WM_NCCALCSIZE 消息发送到窗口,即使窗口的大小未更改也是如此。 如果未指定此标志,则仅当窗口的大小发生更改时, 才会发送WM_NCCALCSIZE 。 |
|
隐藏窗口。 |
|
不激活窗口。 如果未设置此标志,则会激活窗口,并根据 hWndInsertAfter 参数) 的设置 (将窗口移到最顶部或最顶层组的顶部。 |
|
丢弃工作区的整个内容。 如果未指定此标志,则会在调整或重新定位窗口后保存并复制回工作区的有效内容。 |
|
保留当前位置 (忽略 X 和 Y 参数) 。 |
|
不更改 Z 顺序中的所有者窗口位置。 |
|
不重绘更改。 如果设置了此标志,则不执行任何形式的重绘。 这适用于工作区、非工作区 (,包括标题栏和滚动条) ,以及由于移动窗口而发现的父窗口的任何部分。 设置此标志后,应用程序必须显式失效或重新绘制需要重绘的窗口和父窗口的任何部分。 |
|
与 SWP_NOOWNERZORDER 标志相同。 |
|
阻止窗口接收 WM_WINDOWPOSCHANGING 消息。 |
|
保留当前大小 (忽略 cx 和 cy 参数) 。 |
|
保留当前 Z 顺序 (忽略 hWndInsertAfter 参数) 。 |
|
显示“接收端口跟踪选项” 窗口。 |
返回值
类型: BOOL
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
作为 Vista 重新体系结构的一部分,所有服务都从交互式桌面移动到会话 0。 hwnd 和窗口管理器操作仅在会话内有效,并且跨会话尝试操作 hwnd 将失败。 有关详细信息,请参阅 Windows Vista 开发人员故事:应用程序兼容性指南。
如果使用 SetWindowLong 更改了某些窗口数据,则必须调用 SetWindowPos 才能使更改生效。 对 uFlags 使用以下组合: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED
可以通过将 hWndInsertAfter 参数设置为 HWND_TOPMOST 并确保未设置 SWP_NOZORDER 标志,或者设置窗口位置(以 Z 顺序设置窗口位置),使其位于任何现有最顶层窗口之上,从而创建最顶层窗口。 当非最顶部窗口成为最顶部窗口时,它拥有的窗口也将成为最顶部窗口。 但是,其所有者不会更改。
如果 SWP_NOACTIVATE 和 SWP_NOZORDER 标志均未指定 (,则当应用程序请求同时激活窗口及其在 Z 顺序中的位置更改) 时, hWndInsertAfter 中指定的值仅在以下情况下使用。
- hWndInsertAfter 中未指定HWND_TOPMOST标志和HWND_NOTOPMOST标志。
- hWnd 标识的窗口不是活动窗口。
如果最顶层的窗口重新定位到底部 (HWND_BOTTOM Z 顺序 ) 或任何非最顶层窗口之后,则它不再是最顶层的窗口。 当最顶部的窗口成为非顶部窗口时,其所有者和拥有的窗口也成为最顶层的窗口。
非最顶层窗口可以拥有最顶层的窗口,但反向窗口无法发生。 例如,任何窗口) (,由最顶层窗口拥有的对话框本身都是最顶层的窗口,以确保所有拥有的窗口都停留在其所有者之上。
如果应用程序不在前台,并且应位于前台,则必须调用 SetForegroundWindow 函数。
若要使用 SetWindowPos 将窗口置于顶部,拥有该窗口的进程必须具有 SetForegroundWindow 权限。
示例
有关示例,请参阅 初始化对话框。
要求
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | winuser.h (包括 Windows.h) |
Library | User32.lib |
DLL | User32.dll |
API 集 | ext-ms-win-ntuser-window-l1-1-0 (在 Windows 8) 中引入 |
另请参阅
概念性
参考