SetWindowPos改變窗口的位置和狀態

SetWindowPos   函數功能:該函數改變一個子窗口,彈出式窗口式頂層窗口的尺寸,位置和Z序。子窗口,彈出式窗口,及頂層窗口根據它們在屏幕上出現的順序排序、頂層窗口設置的級別最高,並且被設置爲Z序的第一個窗口。   

函數原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);   參數:   

  1. hWnd:窗口句柄。   
  2. hWndlnsertAfter:在z序中的位於被置位的窗口前的窗口句柄。該參數必須爲一個窗口句柄,或下列值之一:   HWND_BOTTOM:將窗口置於Z序的底部。如果參數hWnd標識了一個頂層窗口,則窗口失去頂級位置,並且被置在其他窗口的底部。HWND_NOTOPMOST:將窗口置於所有非頂層窗口之上(即在所有頂層窗口之後)。如果窗口已經是非頂層窗口則該標誌不起作用。HWND_TOP:將窗口置於Z序的頂部。   HWND_TOPMOST:將窗口置於所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級位置。   查看該參數的使用方法,請看說明部分。   
  3. x:以客戶座標指定窗口新位置的左邊界。   
  4. Y:以客戶座標指定窗口新位置的頂邊界。   
  5. cx:以像素指定窗口的新的寬度。   
  6. cy:以像素指定窗口的新的高度。   
  7. 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章