DeferWindowPos功能更新指定窗口的指定多窗口位置结构。该函数然后将句柄返回到更新的结构。EndDeferWindowPos功能使用此结构中的信息同时更改多个窗口的位置和大小。BeginDeferWindowPos函数创建结构。
HDWP DeferWindowPos(
HDWP 【hWinPosInfo】, | //处理内部结构 |
HWND 【的hWnd】, | //处理窗口到位置 |
HWND 【hWndInsertAfter】, | //放置顺序句柄 |
INT 【x】, | // 水平位置 |
INT 【y】, | //垂直位置 |
INT 【cx】, | // width |
INT 【cy】, | // height |
UINT 【uFlags】 | //窗口定位标志 |
); |
参数
【hWinPosInfo】
识别包含一个或多个窗口的大小和位置信息的多窗口位置结构。此结构由BeginDeferWindowPos或最近调用DeferWindowPos返回。
【的hWnd】
标识结构中存储更新信息的窗口。
【hWndInsertAfter】
标识Z定位窗口之前的窗口。此参数必须是窗口句柄或以下值之一:
值 | 含义 |
HWND_BOTTOM | 将窗口放在Z顺序的底部。如果【的hWnd】参数标识最上面的窗口,窗口将失去其最顶层状态,并放置在所有其他窗口的底部。 |
HWND_NOTOPMOST | 将窗口放在所有非最顶层的窗口之上(即,在所有最上面的窗口之后)。如果窗口已经是非最上面的窗口,则此标志无效。 |
HWND_TOP | 将窗口放在Z顺序的顶部。 |
HWND_TOPMOST | 将窗口放在所有非最顶层的窗口之上。即使停用窗口,窗口保持其最高位置。 |
如果在【uFlags】参数中设置了SWP_NOZORDER标志,则忽略此参数。
【x】
指定窗口左上角的x坐标。
【y】
指定窗口左上角的y坐标。
【cx】
指定窗口的新宽度(以像素为单位)。
【cy】
指定窗口的新高度(以像素为单位)。
【uFlags】
指定影响窗口大小和位置的以下值的组合:
值 | 含义 |
SWP_DRAWFRAME | 在窗口周围绘制一个框架(在窗口的类描述中定义)。 |
SWP_FRAMECHANGED | 发送WM_NCCALCSIZE消息到窗口,即使窗口的大小没有被更改。如果未指定此标志,WM_NCCALCSIZE仅在窗口大小更改时发送。 |
SWP_HIDEWINDOW | 隐藏窗户 |
SWP_NOACTIVATE | 不激活窗口。如果未设置此标志,则该窗口将被激活并移动到顶部或顶部的顶部(取决于【hWndInsertAfter】参数的设置)。 |
SWP_NOCOPYBITS | 舍弃客户区域的全部内容。如果未指定此标志,则在窗口大小或重新定位后,客户区的有效内容将保存并复制回客户区。 |
SWP_NOMOVE | 保留当前位置(忽略【X】和【Y】参数)。 |
SWP_NOOWNERZORDER | 不改变所有者窗口的Z位置。 |
SWP_NOREDRAW | 不重绘更改。如果设置此标志,则不会发生任何重印。这适用于客户端区域,非客户区域(包括标题栏和滚动条),并且由于窗口被移动而未覆盖父窗口的任何部分。当设置此标志时,应用程序必须显式地无效或重新绘制需要重新绘制的窗口和父窗口的任何部分。 |
SWP_NOREPOSITION | 与SWP_NOOWNERZORDER标志相同。 |
SWP_NOSENDCHANGING | 防止窗口收到WM_WINDOWPOSCHANGING消息。 |
SWP_NOSIZE | 保留当前大小(忽略【cx】和【cy】参数)。 |
SWP_NOZORDER | 保留当前的Z顺序(忽略【hWndInsertAfter】参数)。 |
SWP_SHOWWINDOW | 显示窗口。 |
返回值
返回值标识更新的多窗口位置结构。该函数返回的句柄可能与传递给函数的句柄不同。该函数返回的新句柄应在下次调用DeferWindowPos或EndDeferWindowPos函数时传递。
如果系统资源不足以使功能成功,则返回值为NULL。
备注
如果对DeferWindowPos的调用失败,应用程序应该放弃窗口定位操作,不调用EndDeferWindowPos.
如果未指定SWP_NOZORDER,Windows将由【的hWnd】参数标识的窗口放置在由【hWndInsertAfter】参数标识的窗口之后的位置。如果【hWndInsertAfter】为NULL或HWND_TOP,则Windows将【的hWnd】窗口放置在Z顺序的顶部。如果【hWndInsertAfter】设置为HWND_BOTTOM,则Windows将【的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)或在任何非最顶层的窗口之后,最上面的窗口不再是最上面的窗口。当最上面的窗口是非最高窗口时,其所有者及其拥有的窗口也是非最顶层的窗口。
非最顶层的窗口可能拥有最上面的窗口,但反之亦然。由最顶层的窗口拥有的任何窗口(例如对话框)本身都是最顶层的窗口,以确保所有拥有的窗口保持在其所有者的上方。
也可以看看