|
一、原理: 應(yīng)用程序在創(chuàng)建一個新窗口之前要向Windows系統(tǒng)注冊這個窗口的類,首先要填寫一個WNDCLASS結(jié)構(gòu),其中的結(jié)構(gòu)參數(shù) lpfnWndProc就是該類窗口函數(shù)的地址,接著調(diào)用RegisterClass()函數(shù)向Windows系統(tǒng)申請注冊這個窗口類。這時Windows會 為其分配一塊內(nèi)存來存放該類的全部信息,這個內(nèi)存塊稱為窗口類內(nèi)存塊。 窗口子類化技術(shù)實際上就是改變窗口內(nèi)存塊中的有關(guān)參數(shù)。由于這種修改只涉及到一個窗口的窗口內(nèi)存塊,因此它不會影響到 屬于同一窗口類的其它窗口的功能和表現(xiàn)。窗口子類化中最常見的是修改窗口內(nèi)存塊中的窗口函數(shù)地址(lpfnWndProc),使其指向 一個新的窗口函數(shù),從而改變原窗口函數(shù)的處理方法,以達(dá)到修改其窗口過程的目的。 二、實現(xiàn)步驟: 1.編寫子類化窗口過程函數(shù)。其格式是標(biāo)準(zhǔn)的窗口過程函數(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ù)地址, 就設(shè)為全局的 EditProc = (WNDPROC)SetWindowLong( //函數(shù)返回的是hChild父窗口的窗口過程函數(shù) hChild, //需要子類化窗口 GWL_WNDPROC |
|
|