用窗口子類化技術改進Windows編輯框控件的功能
發表于:2007-07-14來源:作者:點擊數:
標簽:
作者:張俊鋒、崔華鋒 1.問題的提出 盡管 Windows 系統提供了豐富的通用控件(如按鈕,編輯框,滑動條等),但仍不可能滿足我們實際應用中千差萬別的 需求 ,筆者在某項目的 開發 工作中就遇見了這樣的問題。項目需要一個供用戶輸入表格數據的接口界面,要求
作者:張俊鋒、崔華鋒
1.問題的提出
盡管
Windows系統提供了豐富的通用控件(如按鈕,編輯框,滑動條等),但仍不可能滿足我們實際應用中千差萬別的
需求,筆者在某項目的
開發工作中就遇見了這樣的問題。項目需要一個供用戶輸入表格數據的接口界面,要求只接收用戶輸入的數據信息,并可以利用鍵盤上的光標鍵移動輸入位置以避免用戶在鍵盤和鼠標之間的頻繁切換。簡單地使用Windows的編輯框控件不僅不能對輸入字符進行有效過濾(如果給編輯框控件加上ES_NUMBER風格則只能接收0~9之間的數字而不能接收小數點正負號等需要的字符),而且無法移動控件。如果重起爐灶自己編程來實現,其工作量是相當可觀的。為此,筆者經多次嘗試,終于通過采用窗口子類化方法,很好地解決了上述問題。
2.窗口子類化方法
應用程序為了登記一個窗口類,首先要填寫好一個WNDCLASS結構,其中的結構參數lpfnWndProc就是該類窗口函數的地址,接著調用RegisterClass()函數向
Windows系統申請登記這個窗口類。這時Windows會為其分配一塊內存來存放該類的全部信息,這個內存塊稱為窗口類內存塊。
當應用程序要創建一個屬于某一已登記窗口類的窗口時,Windows便為這個窗口分配一塊內存,即窗口內存塊,用來存放與該窗口有關的專用信息。這些信息一部分來自傳遞給窗口創建函數CreateWindow()或CreateWindowEx()的參數信息,另一部分則來自所屬窗口類的窗口類內存塊,其中參數lpfnWndProc便被Windows從窗口類內存塊復制到為新創建窗口分配的窗口內存塊中。當有消息被發送到這個窗口時,Windows檢查該窗口內存塊中的窗口函數地址(lpfnWndProc),并調用該地址上的函數來處理這些消息。
所謂窗口子類化,實際上就是改變窗口內存塊中的有關參數。由于這種修改只涉及到一個窗口的窗口內存塊,因此它不會影響到屬于同一窗口類的其它窗口的功能和表現。窗口子類化中最常見的是修改窗口內存塊中的窗口函數地址(lpfnWndProc),使其指向一個新的窗口函數,從而改變原窗口函數的處理方法,改進其功能。其基本步驟如下:
?。?)編寫子類化窗口函數。該函數必須為標準的窗口函數格式即:
LRESULT CALLBACK SubClassWndProc ( HWND , UINT , WPARAM , LPARAM ) ;
在這個函數中對感興趣的消息進行處理,而把未處理或者需要原窗口函數進一步處理的消息傳送給原窗口函數;
?。?)利用待子類化窗口的句柄hWnd,調用GetWindowLong ( hWnd , GWL_WNDPROC ) 函數獲得原窗口函數的地址并保存起來;
?。?)調用SetWIndowLong ( hWnd , GWL_WNDPROC , SubClassWndProc ) 把窗口函數設置成子類化窗口函數,完成窗口子類化。
原文轉自:http://www.anti-gravitydesign.com