SetWindowLong是一個Windows API函式。該函式用來改變指定視窗的屬性.函式也將指定的一個32位值設定在視窗的額外存儲空間的指定偏移位置。
基本介紹
- 中文名:設定視窗長型
- 外文名:SetWindowLong
- 作用:改變指定視窗的屬性
- 類型:Windows API函式
- 函式原型:BOOL UnregisterClass
- 相關函式:GetWindowLong
函式原型,參數,返回值,備註,需求,其它函式,
函式原型
LONG SetWindowLong( HWND hWnd, // handle to window int nlndex, // offset of value to set LONG dwNewLong // new value);
參數
hWnd
視窗句柄及間接給出的視窗所屬的類。
nlndex
指定將設定的大於等於0的偏移值。有效值的範圍從0到額外類的存儲空間的位元組數減4:例如若指定了12或多於12個位元組的額外視窗存儲空間,則應設索引位8來訪問第三個4位元組,同樣設定0訪問第一個4位元組,4訪問第二個4位元組。要設定其他任何值,可以指定下面值之一:
常量 | 常量值 | 意義 |
---|---|---|
GWL_EXSTYLE | -20 | 設定一個新的擴展風格。 |
GWL_HINSTANCE | -6 | 設定一個新的應用程式實例句柄。 |
GWL_ID | -12 | 設定一個新的視窗標識符。 |
GWL_STYLE | -16 | 設定一個新的視窗風格。 |
GWL_USERDATA | -21 | 設定與視窗有關的32位值。每個視窗均有一個由創建該視窗的應用程式使用的32位值。 |
GWL_WNDPROC | -4 | 為視窗設定一個新的處理函式。 |
GWL_HWNDPARENT | -8 | 改變子視窗的父視窗,應使用SetParent函式。 |
當hWnd參數標識了一個對話框時,也可使用下列值:
常量 | 常量值 | 意義 |
---|---|---|
DWL_DLGPROC | DWLP_MSGRESULT + sizeof(LRESULT) (值:4) | 設定對話框過程的新地址。 |
DWL_MSGRESULT | 0 | 設定在對話框過程中處理的訊息的返回值。 |
DWL_USER | DWLP_DLGPROC + sizeof(DLGPROC) (值:8) | 設定的應用程式私有的新的額外信息,例如一個句柄或指針。 |
dwNewLong
指定的替換值。
dwNewLong中可以使用以下一些列表控制項的專用風格:
LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT
這四種風格決定控制項的外觀,同時只可以選擇其中一種,分別對應:
大圖示顯示,小圖示顯示,列表顯示,詳細報表顯示
LVS_EDITLABELS 結點的顯示字元可以被編輯,對於報表風格來講可編輯的只為第一列。
LVS_SHOWSELALWAYS 在失去焦點時也顯示當前選中的結點
LVS_SINGLESEL 同時只能選中列表中一項
返回值
如果函式成功,返回值是指定的32位整數的原來的值。如果函式失敗,返回值為0。若想獲得更多錯誤信息,請調用GetLastError函式。
如果指定32位整數的原來的值為0,並且函式成功,則返回值為0,但是函式並不清除最後的錯誤信息,這就很難判斷函式是否成功。這時,就應在調用SetWindowLong之前調用SetLastError(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不支持。
需求
DLL最低版本 | user32.dll |
---|---|
頭檔案 | 在Winuser.h中聲明,包含於Windows.h |
庫檔案 | User32.lib |
作業系統最低版本 | Windows 95, Windows NT 3.1 |
ANSI和Unicode的API名 | SetWindowLongA (ANSI)和SetWindowLongW (Unicode) |
速查:Windows NT 3.1以上版本;Windows 95以上版本;Windows CE 1.0以上版本;
頭檔案:winuser.h;庫檔案:user32.lib;Unicode:在Windows NT上實現為ANSI和Unicode兩種版本。
其它函式
函式功能:該函式刪除一個視窗類,清空該類所需的記憶體。
函式原型:BOOL UnregisterClass(LPCTSTR IpClassName; HINSTANCE hlnstance);
參數:
如果這個參數是一個整型原子,它必須是由此前調用GlobalAdd原子函式創建的全局原子。這個16位整型數小於OxCOOO,必須是lpszClass的低16位,其高位宇必須為0。
hlnstance:創建類的模組的實例句柄。
返回值:如果函式成功,返回值為非零;如果未發現類或由此類創建的視窗仍然存在,則返回值為0。
若想獲得更多錯誤信息,請調用GetLastError函式。
備註:在調用這個函式之前,應用程式必須銷毀由指定類創建的所有視窗。
應用程式註冊的所有視窗類在應用程式中止後都為未註冊的類。
Windows 95:所有由OLL註冊的視窗類在DLL卸載後均未註冊的類。
windows NT:所有由DLL註冊的類在DLL卸載後仍為已註冊的類。
速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;頭檔案:winuser.h;庫檔案:user32.lib;Unicode:在Windows NT上實現為Uhicode和ANSI兩種版本。
本API在VB中的使用方法:
Private Declare Function SetClassLong Lib "user32.dll" Alias "SetClassLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long _ ) As LongPrivate Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long _ ) As LongPrivate Const GCL_STYLE As Long = -26&Private Const GWL_STYLE As Long = -16&Private Const GWL_EXSTYLE As Long = -20&Private Sub Form_Load() SetClassLong hwnd, GCL_STYLE, 0& SetWindowLong hwnd, GWL_STYLE, 0& SetWindowLong hwnd, GWL_EXSTYLE, 0& Hide Show DoEvents EndEnd Sub