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 中指定的值。
- HWND_TOPMOST或HWND_NOTOPMOST旗標都未在 hWndInsertAfter 中指定。
- hWnd 所識別的視窗不是使用中的視窗。
如果最上層視窗重新置放到下層 (HWND_BOTTOM Z 順序的 ) , 或位於任何非最上層窗口之後,它就不再是最上層。 當最上層視窗成為非最上層時,其擁有者和擁有的視窗也會成為最上層的視窗。
非最上層視窗可以擁有最上層的視窗,但無法發生反向。 例如,任何視窗 (,最上層視窗所擁有的對話框) 本身都是最上層視窗,以確保所有擁有的視窗都維持在其擁有者上方。
如果應用程式不在前景,而且應該位於前景,則必須呼叫 SetForegroundWindow 函式。
若要使用 SetWindowPos 將視窗帶入頂端,擁有視窗的程式必須具有 SetForegroundWindow 許可權。
範例
如需範例,請參閱 初始化對話方塊。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 專業版 [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限傳統型應用程式] |
目標平台 | Windows |
標頭 | winuser.h (包括 Windows.h) |
程式庫 | User32.lib |
Dll | User32.dll |
API 集合 | ext-ms-win-ntuser-window-l1-1-0 (於 Windows 8) |
另請參閱
概念
參考