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
窗口大小调整和定位标志。 此参数可以是以下值的组合。
值 | 含义 |
---|---|
|
如果调用线程和拥有窗口的线程附加到不同的输入队列,则系统会将请求发布到拥有窗口的线程。 这可以防止调用线程阻止其执行,而其他线程处理请求。 |
|
阻止生成 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 标识的窗口不是活动窗口。
如果将最顶层窗口重新定位到 Z 顺序的底部 (HWND_BOTTOM) ,或者在任何非最顶部窗口之后,则它不再是最顶部窗口。 当最顶部的窗口成为非最顶部窗口时,其所有者及其拥有的窗口也成为非最顶部的窗口。
非最顶部窗口可以拥有最顶部的窗口,但不能发生相反的情况。 例如,任何窗口 (,) 由最顶部窗口拥有的对话框本身都会成为最顶部的窗口,以确保所有拥有的窗口都高于其所有者。
如果应用程序不在前台,并且应位于前台,则必须调用 SetForegroundWindow 函数。
若要使用 SetWindowPos 将窗口置于顶部,拥有该窗口的进程必须具有 SetForegroundWindow 权限。
示例
有关示例,请参阅 初始化对话框。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | winuser.h (包括 Windows.h) |
Library | User32.lib |
DLL | User32.dll |
API 集 | 在 Windows 8) 中引入的 ext-ms-win-ntuser-window-l1-1-0 ( |
请参阅
概念性
引用