Windows SDK筆記(三):定制控件消息處理函數
作者:
馮明德
一、概述
控件的消息處理函數是由系統定義好了的,通常情況下,不需要自己提供。
但當需要對控件進行特殊控制時,可以提供一個消息處理函數,替換原來的消息處理函數。
自己的處理完成后,再調用控件的缺省消息處理。
二、相關函數
1.窗口類的屬性可以通過GetWindowLong和SetWindowLong進行讀取和設置
LONG GetWindowLong( HWND hWnd, // handle to window int nIndex // offset of value to retrieve ); LONG SetWindowLong( HWND hWnd, // handle to window int nIndex, // offset of value to set LONG dwNewLong // new value );可以返回或設置以下內容:
nIndex值 意義
GWL_EXSTYLE 擴展風格
GWL_STYLE 風格
GWL_WNDPROC 消息處理函數
GWL_HINSTANCE 實例
GWL_ID 窗口ID
GWL_USERDATA 用戶數據
DWL_DLGPROC 對話框消息處理函數
DWL_MSGRESULT
DWL_USER
所以使用
OldMsgProc = (WNDPROC)SetWindowLong (hControlWnd, GWL_WNDPROC, (LONG)MyMsgProc);將控件消息處理函數替換成MyMsgProc,原處理函數被OldMsgProc記錄。
2.調用消息處理函數
LRESULT CallWindowProc( WNDPROC lpPrevWndFunc, // pointer to previous procedure HWND hWnd, // handle to window UINT Msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter );
三、示例
1.提供新處理函數
//記錄原來處理函數的全局變量 WNDPROC OldMsgProc; //新消息處理函數 LRESULT MyMsgProc(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: ::MessageBox(NULL,"click!","",MB_OK); } //調用控件原來的消息處理函數 return CallWindowProc(OldMsgProc,hwnd,message,wParam,lParam); }
2.建立窗口后,更改消息處理函數
case WM_CREATE: { HWND hControlWnd = CreateWindowEx(0,"BUTTON", TEXT("按鈕(&A)"), WS_CHILD | WS_VISIBLE|BS_PUSHBUTTON, 10, 10, 100, 100, hwnd, (HMENU)1000, //控件ID ((LPCREATESTRUCT) lParam)->hInstance, //實例句柄 NULL); //嵌入新的消息處理函數 OldMsgProc = (WNDPROC) SetWindowLong (hControlWnd, GWL_WNDPROC, (LONG)MyMsgProc); } return 0;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
