一、原理:
應用程序在創(chuàng)建一個新窗口之前要向Windows系統(tǒng)注冊這個窗口的類,首先要填寫一個WNDCLASS結構,其中的結構參數(shù)
lpfnWndProc就是該類窗口函數(shù)的地址,接著調(diào)用RegisterClass()函數(shù)向Windows系統(tǒng)申請注冊這個窗口類。這時Windows會
為其分配一塊內(nèi)存來存放該類的全部信息,這個內(nèi)存塊稱為窗口類內(nèi)存塊。
窗口子類化技術實際上就是改變窗口內(nèi)存塊中的有關參數(shù)。由于這種修改只涉及到一個窗口的窗口內(nèi)存塊,因此它不會影響到
屬于同一窗口類的其它窗口的功能和表現(xiàn)。窗口子類化中最常見的是修改窗口內(nèi)存塊中的窗口函數(shù)地址(lpfnWndProc),使其指向
一個新的窗口函數(shù),從而改變原窗口函數(shù)的處理方法,以達到修改其窗口過程的目的。
二、實現(xiàn)步驟:
1.編寫子類化窗口過程函數(shù)。其格式是標準的窗口過程函數(shù)格式即:
LRESULT CALLBACK SubClassWndProc ( HWND , UINT , WPARAM , LPARAM) ;
參數(shù)含義與窗口過程函數(shù)相同。
2.調(diào)用GetWindowLong ( hWnd , GWL_WNDPROC )函數(shù)獲得原窗口函數(shù)的地址并保存起來;其中參數(shù)hWnd為待子類化窗口句柄。
3.調(diào)用SetWIndowLong ( hWnd , GWL_WNDPROC , SubClassWndProc )將窗口函數(shù)替換成子類化函數(shù),實現(xiàn)窗口子類化。
三、Example:
LRESULT CALLBACK ProcFloat(HWND,UINT,WPARAM,LPARAM);
WNDPROC EditProc; //EditProc用來保存原窗口函數(shù)地址, 就設為全局的
EditProc = (WNDPROC)SetWindowLong( //函數(shù)返回的是hChild父窗口的窗口過程函數(shù)
hChild, //需要子類化窗口
GWL_WNDPROC
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。