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)
Places 所有非最上層視窗上方的視窗。 即使視窗已停用,視窗仍會維持最上層的位置。

[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 順序中變更啟動視窗的位置,而不受限制,也可以啟動視窗,然後將它移至最上層或非最上層視窗的頂端。

如果最上層視窗重新定位到底端 (HWND_BOTTOM ) Z 順序或位於任何非最上層窗口之後,最上層視窗就不再是最上層視窗。 當最上層視窗成為非最上層時,其擁有者和擁有的視窗也會成為最上層的視窗。

非最上層視窗可能會擁有最上層的視窗,但反之亦然。 例如,任何視窗 (,最上層視窗所擁有的對話框) 本身都會成為最上層視窗,以確保所有擁有的視窗都停留在其擁有者之上。

規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
目標平台 Windows
標頭 winuser.h (包含 Windows.h)
程式庫 User32.lib
Dll User32.dll
API 集合 ext-ms-win-ntuser-window-l1-1-4 (Windows 10 10.0.14393 版)

另請參閱

BeginDeferWindowPos

概念

EndDeferWindowPos

參考

ShowWindow

Windows