SetWindowPos函式改變一個子視窗,彈出式視窗或頂層視窗的尺寸,位置和Z序。子視窗,彈出式視窗,及頂層視窗根據它們在螢幕上出現的順序排序、頂層視窗設定的級別最高,並且被設定為Z序的第一個視窗。
基本介紹
- 中文名:SetWindowPos
- 原型:BOOL SetWindowPos
- 功能:改變一個子視窗,彈出式視窗
- 參數:hWnd視窗句柄
函式原型,函式參數,返回值,其它相關,VB例子,VC原型,VC功能,參數,VC例子,c#說明,其他相關,
函式原型
WINUSERAPIBOOLWINAPISetWindowPos(HWNDhWnd,HWNDhWndInsertAfter,intX,intY,intcx,_In_intcy,UINTuFlags);
函式參數
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
視窗尺寸和定位的標誌。該參數可以是下列值的組合:
- SWP_ASYNCWINDOWPOS:如果調用進程不擁有視窗,系統會向擁有視窗的執行緒發出需求。這就防止調用執行緒在其他執行緒處理需求的時候發生死鎖。
- SWP_DEFERERASE:防止產生WM_SYNCPAINT訊息。
- SWP_DRAWFRAME:在視窗周圍畫一個框線(定義在視窗類描述中)。
- SWP_FRAMECHANGED:給視窗傳送WM_NCCALCSIZE訊息,即使視窗尺寸沒有改變也會傳送該訊息。如果未指定這個標誌,只有在改變了視窗尺寸時才傳送WM_NCCALCSIZE。
- SWP_HIDEWINDOW;隱藏視窗。
- SWP_NOACTIVATE:不激活視窗。如果未設定標誌,則視窗被激活,並被設定到其他最高級視窗或非最高級組的頂部(根據參數hWndlnsertAfter設定)。
- 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序(忽略hWndlnsertAfter參數)。
- SWP_SHOWWINDOW:顯示視窗。
返回值
如果函式成功,返回值為非零;如果函式失敗,返回值為零。若想獲得更多錯誤訊息,請調用GetLastError函式。
其它相關
備註:如果設定了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。
VB例子
加入本函式的聲明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
VC原型
BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy,UINT nFlags);
VC功能
調用這個成員函式以改變子視窗、彈出視窗和頂層視窗的大小、位置和Z軸次序。視窗在螢幕上按照它們的Z軸次序排序。在Z軸次序上處於頂端的視窗將程式在所有其它視窗的頂部。子視窗的所有坐標都是客戶坐標(相對於父視窗客戶區的左上角)。視窗可以被移動到Z軸次序的頂部,既可以通過將pWndInsertAfter參數設為&wndTopMost,並確保沒有設定SWP_NOZORDER標誌,也可以通過設定視窗的Z軸次序使它位於所有現存的頂層視窗上方。當一個非頂層視窗被設為頂層視窗時,它擁有的視窗也被設為頂層的。它的擁有者不發生變化。如果頂層視窗被重新定位到Z軸次序的底部(&wndBottom)或任何非頂層視窗之後,則它將不再是頂層視窗。當頂層視窗被變為非頂層視窗時,它所有的擁有者和它擁有的所有視窗都被變為非頂層視窗。
參數
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 顯示視窗。
VC例子
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
}
c#說明
[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;
其他相關
易語言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訊息進入視窗,即使視窗的大小沒有改變;
.參數 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訊息進入視窗,即使視窗的大小沒有改變;