複製鏈接
請複製以下鏈接發送給好友

子類化

鎖定
如果你曾經在 Windows 環境下編過程序,有時候就會發現:有一個現成的窗口,幾乎有你所需要的全部功能,但還不完全一樣。如果你需要一個具有過濾特殊字符功能的 Edit 控件。當然最直接的方法就是自己用代碼來實現,但這的確是一個費時又很困難的任務,而子類化就可以用來做這種事情。
中文名
子類化
主要使用函數
SetWindowLong

目錄

子類化術語簡介

子類化允許你接管被子類化的窗口,使你對它有絕對的控制權。舉個例子了來闡明一下:例如你需要一個只接受十六進制數字輸入的文本編輯框,如果使用一個簡單的 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 OldWindowProc
OldWindowProc = 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
}