複製鏈接
請複製以下鏈接發送給好友

SetWindowPos

鎖定
SetWindowPos函數改變一個子窗口,彈出式窗口或頂層窗口的尺寸,位置和Z序。子窗口,彈出式窗口,及頂層窗口根據它們在屏幕上出現的順序排序、頂層窗口設置的級別最高,並且被設置為Z序的第一個窗口。
中文名
SetWindowPos
原    型
BOOL SetWindowPos
功    能
改變一個子窗口,彈出式窗口
參    數
hWnd窗口句柄

SetWindowPos函數原型

WINUSERAPI BOOL WINAPI SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx, int cy, UINT uFlags);

SetWindowPos函數參數

hwnd
在z序中的位於被置位的窗口前的窗口句柄。該參數必須為一個窗口句柄
hWndlnsertAfter
用於標識在z-順序的此 CWnd 對象之前的 CWnd 對象。如果uFlags參數中設置了SWP_NOZORDER標記則本參數將被忽略。可為下列值之一:
  • HWND_BOTTOM:值為1,將窗口置於Z序的底部。如果參數hWnd標識了一個頂層窗口,則窗口失去頂級位置,並且被置在其他窗口的底部。
  • HWND_NOTOPMOST:值為-2,將窗口置於所有非頂層窗口之上(即在所有頂層窗口之後)。如果窗口已經是非頂層窗口則該標誌不起作用。
  • HWND_TOP:值為0,將窗口置於Z序的頂部。
  • HWND_TOPMOST:值為-1,將窗口置於所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級位置。
查看該參數的使用方法,請看説明部分。
x
以客户座標指定窗口新位置的左邊界。
Y
以客户座標指定窗口新位置的頂邊界。
cx
以像素指定窗口的新的寬度。
cy
以像素指定窗口的新的高度。
uFlags
窗口尺寸和定位的標誌。該參數可以是下列值的組合:
  1. SWP_ASYNCWINDOWPOS:如果調用進程不擁有窗口,系統會向擁有窗口的線程發出需求。這就防止調用線程在其他線程處理需求的時候發生死鎖。
  2. SWP_DEFERERASE:防止產生WM_SYNCPAINT消息。
  3. SWP_DRAWFRAME:在窗口周圍畫一個邊框(定義在窗口類描述中)。
  4. SWP_FRAMECHANGED:給窗口發送WM_NCCALCSIZE消息,即使窗口尺寸沒有改變也會發送該消息。如果未指定這個標誌,只有在改變了窗口尺寸時才發送WM_NCCALCSIZE。
  5. SWP_HIDEWINDOW;隱藏窗口。
  6. SWP_NOACTIVATE:不激活窗口。如果未設置標誌,則窗口被激活,並被設置到其他最高級窗口或非最高級組的頂部(根據參數hWndlnsertAfter設置)。
  7. SWP_NOCOPYBITS:清除客户區的所有內容。如果未設置該標誌,客户區的有效內容被保存並且在窗口尺寸更新和重定位後拷貝回客户區。
  8. SWP_NOMOVE:維持當前位置(忽略X和Y參數)。
  9. SWP_NOOWNERZORDER:不改變z序中的所有者窗口的位置。
  10. SWP_NOREDRAW:不重畫改變的內容。如果設置了這個標誌,則不發生任何重畫動作。適用於客户區和非客户區(包括標題欄和滾動條)和任何由於窗回移動而露出的父窗口的所有部分。如果設置了這個標誌,應用程序必須明確地使窗口無效並區重畫窗口的任何部分和父窗口需要重畫的部分。
  11. SWP_NOREPOSITION:與SWP_NOOWNERZORDER標誌相同。
  12. SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。
  13. SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數)。
  14. SWP_NOZORDER:維持當前Z序(忽略hWndlnsertAfter參數)。
  15. SWP_SHOWWINDOW:顯示窗口。

SetWindowPos返回值

如果函數成功,返回值為非零;如果函數失敗,返回值為零。若想獲得更多錯誤消息,請調用GetLastError函數

SetWindowPos其它相關

備註:如果設置了SWP_SHOWWINDOW和SWP_HIDEWINDOW標誌,則窗口不能被移動和改變大小。如果使用SetWindowLong改變了窗口的某些數據,則必須調用函數SetWindowPos來作真正的改變。使用下列的組合標誌:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。
有兩種方法將窗口設為最頂層窗口:一種是將參數hWndlnsertAfter設置為HWND_TOPMOST並確保沒有設置SWP_NOZORDER標誌;另一種是設置窗口在Z序中的位置以使其在其他存在的窗口之上。當一個窗口被置為最頂層窗口時,屬於它的所有窗口均為最頂層窗口,而它的所有者的z序並不改變。
如果HWND_TOPMOST和HWND_NOTOPMOST標誌均未指定,即應用程序要求窗口在激活的同時改變其在Z序中的位置時,在參數hWndinsertAfter中指定的值只有在下列條件中才使用:
在hWndlnsertAfter參數中沒有設定HWND_NOTOPMOST和HWND_TOPMOST標誌。
由hWnd參數標識的窗口不是激活窗口。
如果未將一個非激活窗口設定到z序的頂端,應用程序不能激活該窗口。應用程序可以無任何限制地改變被激活窗口在Z序中的位置,或激活一個窗口並將其移到最高級窗口的頂部或非最高級窗口的頂部。
如果一個頂層窗口被重定位到z序的底部(HWND_BOTTOM)或在任何非最高序的窗口之後,該窗口就不再是最頂層窗口。當一個最頂層窗口被置為非最頂級,則它的所有者窗口和所屬者窗口均為非最頂層窗口。
一個非最頂端窗口可以擁有一個最頂端窗口,但反之則不可以。任何屬於頂層窗口的窗口(例如一個對話框)本身就被置為頂層窗口,以確保所有被屬窗口都在它們的所有者之上。
如果應用程序不在前台,但應該位於前台,就應調用SetForegroundWindow函數來設置。
Windows CE:如果這是一個可見的頂層窗口,並且未指定SWP_NOACTIVATE標誌,則這個函數將激活窗口、如果這是當前的激活窗口,並且指定了SWP_NOACTIVATE或SWP_HIDEWINDOW標誌,則激活另外一個可見的頂層窗口。
當在這個函數中的nFlags參數裏指定了SWP_FRAMECHANGED標誌時,WindowsCE重畫窗口的整個非客户區,這可能會改變客户區的大小。這也是重新計算客户區的唯一途徑,也是通過調用SetwindowLong函數改變窗口風格後通常使用的方法。
SetWindowPos將使WM_WINDOWPOSCHANGED消息向窗口發送,在這個消息中傳遞的標誌與傳遞給函數的相同。這個函數不傳遞其他消息。
Windows CE 1.0不支持在hWndlnsertAber參數中的HWND_TOPMOST和HWND_NOTOPMOST常量。
Windows CE1.0不支持在fuFags參數中的SWP_DRAWFRAME和SWP_NOCOPYBITS標誌。
速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;頭文件:winuser.h庫文件:eser32lib。

SetWindowPosVB例子

加入本函數的聲明Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
新建個控件 Check1
'完整代碼如下:
Private Sub Check1_Click()
Dim Q
If Check1.Value = 1 Then
Q = SetWindowPos(Me.hWnd, -1, 0, 0, 0, 0, 3)
Else
Q = SetWindowPos(Me.hWnd, -2, 0, 0, 0, 0, 3)
End If
End Sub
Private Sub Form_Load()
Check1.Caption = "點擊窗口置前"
End Sub

SetWindowPosVC原型

BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy,UINT nFlags);

SetWindowPosVC功能

調用這個成員函數以改變子窗口、彈出窗口和頂層窗口的大小、位置和Z軸次序。窗口在屏幕上按照它們的Z軸次序排序。在Z軸次序上處於頂端的窗口將程序在所有其它窗口的頂部。子窗口的所有座標都是客户座標(相對於父窗口客户區的左上角)。窗口可以被移動到Z軸次序的頂部,既可以通過將pWndInsertAfter參數設為&wndTopMost,並確保沒有設置SWP_NOZORDER標誌,也可以通過設置窗口的Z軸次序使它位於所有現存的頂層窗口上方。當一個非頂層窗口被設為頂層窗口時,它擁有的窗口也被設為頂層的。它的擁有者不發生變化。如果頂層窗口被重新定位到Z軸次序的底部(&wndBottom)或任何非頂層窗口之後,則它將不再是頂層窗口。當頂層窗口被變為非頂層窗口時,它所有的擁有者和它擁有的所有窗口都被變為非頂層窗口。

SetWindowPos參數

pWndInsertAfter
標識了在Z軸次序上位於這個CWnd對象之前的CWnd對象。這個參數可以是指向CWnd對象的指針,也可以是指向下列值的指針:
wndBottom 將窗口放在Z軸次序的底部。如果這個CWnd是一個頂層窗口,則窗口將失去它的頂層狀態;系統將這個窗口放在其它所有窗口的底部。
wndTop 將窗口放在Z軸次序的頂部。
wndTopMost 將窗口放在所有非頂層窗口的上面。這個窗口將保持它的頂層位置,即使它失去了活動狀態。
wndNoTopMost 將窗口重新定位到所有非頂層窗口的頂部(這意味着在所有的頂層窗口之下)。這個標誌對那些已經是非頂層窗口的窗口沒有作用。有關這個函數以及這些參數的使用規則參見説明部分。
x指定了窗口左邊的新位置。
y指定了窗口頂部的新位置。
cx指定了窗口的新寬度。
cy指定了窗口的新高度。
nFlags指定了大小和位置選項。這個參數可以是下列值的組合:
SWP_DRAWFRAME 圍繞窗口畫出邊框(在創建窗口的時候定義)。
SWP_FRAMECHANGED 向窗口發送一條WM_NCCALCSIZE消息,即使窗口的大小不會改變。如果沒有指定這個標誌,則僅當窗口的大小發生變化時才發送WM_NCCALCSIZE消息。
SWP_HIDEWINDOW 隱藏窗口。
SWP_NOACTIVATE 不激活窗口。如果沒有設置這個標誌,則窗口將被激活並移動到頂層或非頂層窗口組(依賴於pWndInsertAfter參數的設置)的頂部。
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 保持當前的次序(忽略pWndInsertAfter)。
SWP_SHOWWINDOW 顯示窗口。

SetWindowPosVC例子

BOOL CDesktopADDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO: 在此添加額外的初始化代碼
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
int dx = 600;
int dy = 400;
SetWindowPos(&wndBottom,cx-dx,cy-dy,dx,dy,SWP_NOACTIVATE); //設置廣告窗口浮動於右下角
return TRUE; // 除非將焦點設置到控件,否則返回 TRUE
}

SetWindowPosc#説明

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags
);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOP = new IntPtr(0);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_NOZORDER = 0x0004;
const UInt32 SWP_NOREDRAW = 0x0008;
const UInt32 SWP_NOACTIVATE = 0x0010;
const UInt32 SWP_FRAMECHANGED = 0x0020;
const UInt32 SWP_SHOWWINDOW = 0x0040;
const UInt32 SWP_HIDEWINDOW = 0x0080;
const UInt32 SWP_NOCOPYBITS = 0x0100;
const UInt32 SWP_NOOWNERZORDER = 0x0200;
const UInt32 SWP_NOSENDCHANGING = 0x0400;
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

SetWindowPos其他相關

易語言DLL命令使用格式
.DLL命令 API_SetWindowPos, 整數型, "user32", "SetWindowPos", 這個函數能為窗口指定一個新位置和狀態。它也可改變窗口在內部窗口列表中的位置。該函數與DeferWindowPos函數相似,只是它的作用是立即表現出來的(在vb裏使用:針對vb窗體,如它們在win32下屏蔽或最小化,則需重設最頂部狀態。如有必要,請用一個子類處理模塊來重設最頂部狀態 非零表示成功,零表示失敗。會設置GetLastError
.參數 hwnd, 整數型, , 欲定位的窗口
.參數 hWndInsertAfter, 整數型, , 窗口句柄。在窗口列表中,窗口hwnd會置於這個窗口句柄的後面。也可能選用下述值之一:;HWND_BOTTOM:將窗口置於窗口列表底部;HWND_TOP:將窗口置於Z序列的頂部;Z序列代表在分級結構中,窗口針對一個給定級別的窗口顯示的順序;HWND_TOPMOST:將窗口置於列表頂部,並位於任何最頂部窗口的前面;HWND_NOTOPMOST:將窗口置於列表頂部,並位於任何最頂部窗口的後面
.參數 x, 整數型, , 窗口新的x座標。如hwnd是一個子窗口,則x用父窗口的客户區座標表示
.參數 y, 整數型, , 窗口新的y座標。如hwnd是一個子窗口,則y用父窗口的客户區座標表示
.參數 cx, 整數型, , 指定新的窗口寬度
.參數 cy, 整數型, , 指定新的窗口高度
.參數 wFlags, 整數型, , 包含了旗標的一個整數;SWP_DRAWFRAME:圍繞窗口畫一個框;SWP_HIDEWINDOW:隱藏窗口;SWP_NOACTIVATE:不激活窗口;SWP_NOMOVE:保持當前位置(x和y設定將被忽略);SWP_NOREDRAW:窗口不自動重畫;SWP_NOSIZE:保持當前大小(cx和cy會被忽略);SWP_NOZORDER:保持窗口在列表的當前位置(hWndInsertAfter將被忽略);SWP_SHOWWINDOW:顯示窗口;SWP_FRAMECHANGED:強迫一條WM_NCCALCSIZE消息進入窗口,即使窗口的大小沒有改變;