函數(shù)功能
該函數(shù)改變指定窗口的
屬性.
函數(shù)也將指定的一個(gè)32位值設(shè)置在窗口的額外存儲(chǔ)空間的指定偏移位置。
函數(shù)原型
LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong);
參數(shù)
hWnd:
窗口句柄及間接給出的窗口所屬的類。
nlndex:指定將設(shè)定的大于等于0的偏移值。
有效值的
范圍從0到額外類的存儲(chǔ)空間的字節(jié)數(shù)-4:例如若指定了12位或多于12位的額外類存儲(chǔ)空間,則應(yīng)設(shè)為第三個(gè)32位整數(shù)的索引位8。要設(shè)置其他任何值,
可以指定下面值之一:
GWL_EXSTYLE:設(shè)定一個(gè)新的擴(kuò)展
風(fēng)格。
GWL_STYLE:設(shè)定一個(gè)新的窗口風(fēng)格。
GWL_WNDPROC:為窗口過程設(shè)定一個(gè)新的
地址。
GWL_ID:設(shè)置一個(gè)新的窗口標(biāo)識(shí)符。
GWL_HINSTANCE:設(shè)置一個(gè)新的
應(yīng)用程序事例句柄。
GWL_USERDATA:設(shè)置與
窗口有關(guān)的32位值。
每一個(gè)窗口均有一個(gè)由創(chuàng)建該窗口的應(yīng)用程序使用的32位值。
當(dāng)hWnd參數(shù)標(biāo)識(shí)了一個(gè)
對(duì)話框時(shí),也可使用下列值:
DWL_DLGPROC:
設(shè)置對(duì)話框過程的新地址。
DWL_MSGRESULT:設(shè)置在對(duì)話框過程中處理的消息的返回值。
DWL_USER:設(shè)置的應(yīng)用程序私有的新的額外信息,例如一個(gè)句柄或指針。
dwNewLong:指定的替換值。
返回值:
如果函數(shù)成功,返回值是指定的32位整數(shù)的原來的值。
如果函數(shù)失敗,返回值為0。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
如果指定32位整數(shù)的原來的值為0,并且函數(shù)成功,則返回值為0,但是函數(shù)并不清除最后的錯(cuò)誤信息,這就很難判斷函數(shù)是否成功。這時(shí),就應(yīng)在調(diào)用SetWindowLong之前調(diào)用callingSetLastError(0)函數(shù)來清除最后的錯(cuò)誤信息。這樣,如果函數(shù)失敗就會(huì)返回0,并且GetLastError。也返回一個(gè)非零值。 如果由hWnd參數(shù)指定的窗口與調(diào)用線程不屬于同一進(jìn)程,將導(dǎo)致SetWindowLong函數(shù)失敗。
指定的窗口數(shù)據(jù)是在緩存中保存的,因此在調(diào)用SetWindowLong之后再調(diào)用SetWindowPos函數(shù)才能使SetWindowLong函數(shù)所作的改變生效。
如果使用帶GWL_WNDPROC索引值的SetWindowLong函數(shù)替換窗口過程,則該窗口過程必須與WindowProccallback函數(shù)說明部分指定的指導(dǎo)行一致。
如果使用帶DWL_MSGRESULT索引值的SetWindowLong函數(shù)來設(shè)置由一個(gè)對(duì)話框過程處理的消息的返回值,應(yīng)在此后立即返回TRUE。否則,如果又調(diào)用了其他函數(shù)而使對(duì)話框過程接收到一個(gè)窗口消息,則嵌套的窗口消息可能改寫使用DWL_MSGRESULT設(shè)定的返回值。
可以使用帶GWL_WNDPROC索引值的SetWindowLong函數(shù)創(chuàng)建一個(gè)窗口類的子類,該窗口類是用于創(chuàng)建該窗口的關(guān)。一個(gè)應(yīng)用程序可以一個(gè)系統(tǒng)美為于類,但是不能以一個(gè)其他進(jìn)程產(chǎn)生的窗口類為子類,SetwindowLong函數(shù)通過改變與一個(gè)特殊的窗口類相聯(lián)系的窗口過程來創(chuàng)建窗口子類,從而使系統(tǒng)調(diào)用新的窗口過程而不是以前定義的窗口過程。應(yīng)用程序必須通過調(diào)用CallWindowProc函數(shù)向前窗口傳遞未被新窗口處理的消息,這樣作允許應(yīng)用程序創(chuàng)建一個(gè)窗口過程鏈。
通過使用函數(shù)RegisterClassEx將結(jié)構(gòu)WNDCLASSEX中的cbWndExtra單元指定為一個(gè)非0值來保留新外窗口內(nèi)存。
不能通過調(diào)用帶GWL_HWNDPARENT索引值的SetWindowLong的函數(shù)來改變子窗口的父窗口,應(yīng)使用SetParent函數(shù)。