子類化
子類化允許你接管被子類化的視窗,使你對它有絕對的控制權。舉個例子了來闡明一下:例如你需要一個只接受十六進制數字輸入的文本編輯框,如果使用一個簡單的 Edit控制項,當用戶輸入十六進制以外的字元時,你既不知道也無計可施。也就是說,當用戶進
文本框中輸入字元串 "zb+q*" 時,如果除了拒絕接受整個字元串以外幾乎什麼也不能做,至少這顯得特別不專業。重要的是,你需要具有輸入檢測的能力,即每當用戶輸入一個字元到編輯框中時要能檢測這個字元。
現在來解釋實現細節:當用戶往
文本框中輸入
字元時,Windows 會給Edit控制項的
視窗函式傳送 WM_CHAR 訊息。這個
視窗函式本身寄生於 Windows 中,因此不能直接修改它。但是我們可以重定向這個訊息使之傳送到我們自己編寫的視窗處理函式。如果自定義視窗要處理這個訊息那就可以處理它,如果不處理就可以把這個訊息轉發到它原來視窗處理函式。通過這種方式,自定義的視窗處理函式就把它自己插入到 Windows 系統和 Edit 控制項之間。
說明
獲取視窗舊的訊息處理函式,設定新的訊息處理函式,進行需要進行的訊息處理,其他的交給就得訊息處理函式
LONG GetWindowLong(HWNDhWnd,intnlndex);
LONG SetWindowLong(HWNDhWnd,intnlndex,LONGdwNewLong);
LRESULT CallWindowProc(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM IParam);
示例:
Long OldWindowProcOldWindowProc = GetWindowLong(/*你的視窗句柄*/,GWL_WNDPROC/* -4 */);SetWindowLong(/*你的視窗句柄*/,GWL_WNDPROC/* -4 */,NewWndProc);LRESULT NewWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){ if(message==/*某某訊息值*/) { } return CallWindowProc(OldWndProc,hWnd,message,wParam,lParam);//不處理的交給舊的PROC}