子類化

如果你曾經在 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 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}

相關詞條

熱門詞條

聯絡我們