SetWindowPos
函數功能:該函數改變一個子窗口,彈出式窗口式頂層窗口的尺寸,位置和Z序。子窗口,彈出式窗口,及頂層窗口根據它們在屏幕上出現的順序排序、頂層窗口設置的級別最高,並且被設置為Z序的第一個窗口。
函數原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);
參數:
hWnd:窗口句柄。
hWndlnsertAfter:在z序中的位於被置位的窗口前的窗口句柄。該參數必須為一個窗口句柄,或下列值之一:
HWND_BOTTOM:將窗口置於Z序的底部。如果參數hWnd標識了一個頂層窗口,則窗口失去頂級位置,並且被置在其他窗口的底部。
HWND_NOTOPMOST:將窗口置於所有非頂層窗口之上(即在所有頂層窗口之后)。如果窗口已經是非頂層窗口則該標志不起作用。
HWND_TOP:將窗口置於Z序的頂部。
HWND_TOPMOST:將窗口置於所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級位置。
查看該參數的使用方法,請看說明部分。
x:以客戶坐標指定窗口新位置的左邊界。
Y:以客戶坐標指定窗口新位置的頂邊界。
cx:以像素指定窗口的新的寬度。
cy:以像素指定窗口的新的高度。
uFlags:窗口尺寸和定位的標志。該參數可以是下列值的組合:
SWP_ASNCWINDOWPOS:如果調用進程不擁有窗口,系統會向擁有窗口的線程發出需求。這就防止調用線程在其他線程處理需求的時候發生死鎖。
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標志,則窗口不能被移動和改變大小。如果使用SetWindowLoog改變了窗口的某些數據,則必須調用函數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。
//聲明:
SetWindowPos(
hWnd: HWND; {窗口句柄}
hWndInsertAfter: HWND; {窗口的 Z 順序}
X, Y: Integer; {位置}
cx, cy: Integer; {大小}
uFlags: UINT {選項}
): BOOL;
//hWndInsertAfter 參數可選值:
HWND_TOP = 0; {在前面}
HWND_BOTTOM = 1; {在后面}
HWND_TOPMOST = HWND(-1); {在前面, 位於任何頂部窗口的前面}
HWND_NOTOPMOST = HWND(-2); {在前面, 位於其他頂部窗口的后面}
//uFlags 參數可選值:
SWP_NOSIZE = 1; {忽略 cx、cy, 保持大小}
SWP_NOMOVE = 2; {忽略 X、Y, 不改變位置}
SWP_NOZORDER = 4; {忽略 hWndInsertAfter, 保持 Z 順序}
SWP_NOREDRAW = 8; {不重繪}
SWP_NOACTIVATE = $10; {不激活}
SWP_FRAMECHANGED = $20; {強制發送 WM_NCCALCSIZE 消息, 一般只是在改變大小時才發送此消息}
SWP_SHOWWINDOW = $40; {顯示窗口}
SWP_HIDEWINDOW = $80; {隱藏窗口}
SWP_NOCOPYBITS = $100; {丟棄客戶區}
SWP_NOOWNERZORDER = $200; {忽略 hWndInsertAfter, 不改變 Z 序列的所有者}
SWP_NOSENDCHANGING = $400; {不發出 WM_WINDOWPOSCHANGING 消息}
SWP_DRAWFRAME = SWP_FRAMECHANGED; {畫邊框}
SWP_NOREPOSITION = SWP_NOOWNERZORDER;{}
SWP_DEFERERASE = $2000; {防止產生 WM_SYNCPAINT 消息}
SWP_ASYNCWINDOWPOS = $4000; {若調用進程不擁有窗口, 系統會向擁有窗口的線程發出需求}