SetWindowLong和SetWindowPos函數詳解


 

(2009-03-03 09:38:29)
標簽:

雜談

分類: MFC

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標志。

 

 

 SetWindowLong

 
  函數功能:該函數改變指定窗口的 屬性函數也將指定的一個32位值設置在窗口的額外存儲空間的指定偏移位置。
 
  函數原型:LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong);
 
  參數:
 
  hWnd:窗口句柄及間接給出的窗口所屬的類。
 
  nlndex:指定將設定的大於等於0的偏移值。 有效值范圍從0到額外類的存儲空間的字節數-4:例如若指定了12位或多於12位的額外類存儲空間,則應設為第三個32位整數的索引位8。要設置其他任何值,可以指定下面值之一:
 
  GWL_EXSTYLE:設定一個新的擴展 風格。GWL_STYLE:設定一個新的窗口風格。
 
  GWL_WNDPROC:為窗口過程設定一個新的 地址。GWL_ID:設置一個新的窗口標識符。
 
  GWL_HINSTANCE:設置一個新的 應用程序事例句柄。
 
  GWL_USERDATA:設置與 窗口有關的32位值。每一個窗口均有一個由創建該窗口的應用程序使用的32位值。
 
  當hWnd參數標識了一個 對話框時,也可使用下列值:
 
  DWL_DLGPROC: 設置對話框過程的新地址。
 
  DWL_MSGRESULT:設置在對話框過程中處理的消息的返回值。
 
  DWL_USER:設置的應用程序私有的新的額外信息,例如一個句柄或指針。
 
  dwNewLong:指定的替換值。
 
  返回值:如果函數成功,返回值是指定的32位整數的原來的值。如果函數失敗,返回值為0。若想獲得更多錯誤信息,請調用GetLastError函數。
 
  如果指定32位整數的原來的值為0,並且函數成功,則返回值為0,但是函數並不清除最后的錯誤信息,這就很難判斷函數是否成功。這時,就應在調用SetWindowLong之前調用callingSetLastError(0)函數來清除最后的錯誤信息。這樣,如果函數失敗就會返回0,並且GetLastError。也返回一個非零值。
 
  備注;如果由hWnd參數指定的窗口與調用線程不屬於同一進程,將導致SetWindowLong函數失敗。
 
  指定的窗口數據是在緩存中保存的,因此在調用SetWindowLong之后再調用SetWindowPos函數才能使SetWindowLong函數所作的改變生效。
 
  如果使用帶GWL_WNDPROC索引值的SetWindowLong函數替換窗口過程,則該窗口過程必須與WindowProccallback函數說明部分指定的指導行一致。
 
  如果使用帶DWL_MSGRESULT索引值的SetWindowLong函數來設置由一個對話框過程處理的消息的返回值,應在此后立即返回TRUE。否則,如果又調用了其他函數而使對話框過程接收到一個窗口消息,則嵌套的窗口消息可能改寫使用DWL_MSGRESULT設定的返回值。
 
  可以使用帶GWL_WNDPROC索引值的SetWindowLong函數創建一個窗口類的子類,該窗口類是用於創建該窗口的關。一個應用程序可以一個系統美為於類,但是不能以一個其他進程產生的窗口類為子類,SetwindowLong函數通過改變與一個特殊的窗口類相聯系的窗口過程來創建窗口子類,從而使系統調用新的窗口過程而不是以前定義的窗口過程。應用程序必須通過調用CallWindowProc函數向前窗口傳遞未被新窗口處理的消息,這樣作允許應用程序創建一個窗口過程鏈。
 
  通過使用函數RegisterClassEx將結構WNDCLASSEX中的cbWndExtra單元指定為一個非0值來保留新外窗口內存。
 
  不能通過調用帶GWL_HWNDPARENT索引值的SetWindowLong的函數來改變子窗口的父窗口,應使用SetParent函數。
 
  Windows CE:nlndex參數必須是4個字節的倍數不支持unaligned access。
 
  不支持下列nlndex參數值:。
 
  GWL_HINSTANCE;GWL_HWNDPARENTGWL;GWL_USERDATA
 
  Windows CE 2.0版支持在nlndex參數中的DWL_DLGPROC值,但是WindowsCE1.0不支持。
 
  速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本:頭文件:winuser.h;庫文件:user32.lib;Unicode:在Windows NT上實現為Unicode和ANSI兩種版本。
 
  函數功能:該函數刪除一個窗口類,清空該類所需的內存。
 
  函數原型:BOOL UnRegisterClass(LPCTSTR IpClassName; HINSTANCE hlnstance);
 
  參數:
 
  IpClassName:指向一個空結束字符串的指針,或是一個整型原子。如果IpClassName是一個字符串,則它指定了窗口類的類名。這個類名必須由此前調用RegisterClassEx函數來注冊。系統類,如對話框控制,必須被注冊。
 
  如果這個參數是一個整型原子,它必須是由此前調用GlobalAdd原子函數創建的全局原子。這個16位整型數小於OxCOOO,必須是lpszClass的低16位,其高位宇必須為0。
 
  hlnstance:創建類的模塊的事例句柄。
 
  返回值:如果函數成功,返回值為非零;如果未發現類或由此類創建的窗口仍然存在,則返回值為0。
 
  若想獲得更多錯誤信息,請調用GetLastError函數。
 
  備注:在調用這個函數之前,應用程序必須銷毀由指定類創建的所有窗口。
 
  應用程序注冊的所有窗口類在應用程序中止后都為未注冊的類。
 
  Windows 95:所有由OLL注冊的窗口類在DLL卸載后均未注冊的類。
 
  windows NT:所有由DLL注冊的類在DLL卸載后仍為已注冊的類。
 
 
 [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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM