RY theClass::_messageEntries //开始初始化消息入口 endifdefine END_MESSAGE_MAP 0 0 0 0 AfxSig_end AFX_PMSG0 指示消息映射结束.在这两个宏之间还有ON_WM_PAINTON_WM_LBUTTONDOWN它们是我们在 ClassWizard 中选择了 WM_PAINT 和 WM_LBUTTONDOWN 消息后MFC 自动加入的那么这两个又是如何定义的呢……define ON_WM_PAINT WM_PAINT 0 0 0 AfxSig_vv ————- 消息处理类型 ——————- LastID ———————- ID0 窗口消息 ————————- 控制码——————————– WM_PAINT 消息AFX_PMSGAFX_PMSGWvoid AFX_MSG_CALL CWnd::voidOnPaint 消息处理函数…..define ON_WM_LBUTTONDOWN WM_LBUTTONDOWN 0 0 0 AfxSig_vwp WM_LBUTTON 消息AFX_PMSGAFX_PMSGWvoid AFX_MSG_CALL CWnd::UINT CPointOnLButtonDown 消息处理函数……现在我们差不多可以看得出来了消息处理函数可以靠_messageEntries 来找到每个消息的处理函数.我们可以再看看 CWnd 类来验证我们的想法.先看一下窗口的建立过程:BOOL CWnd::CreateLPCTSTR lpszClassNameLPCTSTR lpszWindowName DWORD dwStyleconst RECT rectCWnd pParentWnd UINT nIDCCreateContext pContext// can’t use for desktop or pop-up windows use CreateEx insteadASSERTpParentWnd NULLASSERTdwStyle WS_POPUP 0return CreateEx0 lpszClassName lpszWindowNamedwStyle WS_CHILDrect.left rect.toprect.right – rect.left rect.bottom – rect.toppParentWnd-GetSafeHwnd HMENUnID LPVOIDpContextBOOL CWnd::CreateExDWORD dwExStyle LPCTSTR lpszClassNameLPCTSTR lpszWindowName DWORD dwStyleint x int y int nWidth int nHeightHWND hWndParent HMENU nIDorHMenu LPVOID lpParam// allow modification of several common create parametersCREATESTRUCT cscs.dwExStyle dwExStylecs.lpszClass lpszClassNamecs.lpszName lpszWindowNamecs.style dwStylecs.x xcs.y ycs.cx nWidthcs.cy nHeightcs.hwndParent hWndParentcs.hMenu nIDorHMenucs.hInstance AfxGetInstanceHandlecs.lpCreateParams lpParamif PreCreateWindowcsPostNcDestroyreturn FALSEAfxHookWindowCreatethis 函数见后HWND hWnd ::CreateWindowExcs.dwExStyle cs.lpszClasscs.lpszName cs.style cs.x cs.y cs.cx cs.cycs.hwndParent cs.hMenu cs.hInstance cs.lpCreateParamsif AfxUnhookWindowCreatePostNcDestroy // cleanup if CreateWindowEx fails too soonif hWnd NULLreturn FALSEASSERThWnd m_hWnd // should have been set in send msg hookreturn TRUE// for child windowsBOOL CWnd::PreCreateWindowCREATESTRUCT csif cs.lpszClass NULL// make sure the default window class is registeredif AfxDeferRegisterClassAFX_WND_REGreturn FALSE// no WNDCLASS provided – use child window defaultASSERTcs.style WS_CHILDcs.lpszClass _afxWndreturn TRUEvoid AFXAPI AfxHookWindowCreateCWnd pWnd_AFX_THREAD_STATE pThreadState _afxThreadState.GetDataif pThreadState-m_pWndInit pWndreturnif pThreadState-m_hHookOldCbtFilter NULLpThreadState-m_hHookOldCbtFilter ::SetWindowsHookExWH_CBTComputer-based Training当建立、删除、移动、最大化、最小化窗口时,将会调用钩子函数。
_AfxCbtFilterHook NULL ::GetCurrentThreadId 钩子函数if pThreadState-m_hHookOldCbtFilter NULLAfxThrowMemoryExceptionASSERTpThreadState-m_hHookOldCbtFilter NULLASSERTpWnd NULLASSERTpWnd-m_hWnd NULL // only do onceASSERTpThreadState-m_pWndInit NULL // hook not already in progresspThreadState-m_pWndInit pWndBOOL AFXAPI AfxUnhookWindowCreate_AFX_THREAD_STATE pThreadState _afxThreadState.GetDataifndef _AFXDLLif afxContextIsDLL pThreadState-m_hHookOldCbtFilter NULL::UnhookWindowsHookExpThreadState-m_hHookOldCbtFilter删除钩子函数pThreadState-m_hHookOldCbtFilter NULLendifif pThreadState-m_pWndInit NULLpThreadState-m_pWndInit NULLreturn FALSE // was not successfully hookedreturn TRUE// Window creation hooksLRESULT CALLBACK_AfxCbtFilterHookint code WPARAM wParam LPARAM lParam_AFX_THREAD_STATE pThreadState _afxThreadState.GetDataif code HCBT_CREATEWND 是要建立窗口吗?// wait for HCBT_CREATEWND just pass others on…return CallNextHookExpThreadState-m_hHookOldCbtFilter codewParam lParamASSERTlParam NULLLPCREATESTRUCT lpcs LPCBT_CREATEWNDlParam-lpcsASSERTlpcs NULL// this hook exists to set the SendMessage hook on window creations// but this is only done for MFC windows or non-child windows// the subclassing cannot be done at this point because on Win32s// the window does not have the WNDPROC set yetCWnd pWndInit pThreadState-m_pWndInitif pWndInit NULL lpcs-style WS_CHILD afxContextIsDLLASSERTwParam NULL // should be non-NULL HWNDHWND hWnd HWNDwParamWNDPROC oldWndProcif pWndInit NULL 窗口建立来自一个 CWnd// the window should not be in the permanent map at this timeASSERTCWnd::FromHandlePermanenthWnd NULL// connect the HWND to pWndInit…pWndInit-AttachhWnd// allow other subclassing to occur firstpWndInit-PreSubclassWindowWNDPROC pOldWndProc pWndInit-GetSuperWndProcAddrASSERTpOldWndProc NULLifndef _MAC_AFX_CTL3D_STATE pCtl3dStateDWORD dwFlagsif afxData.bWin4 afxContextIsDLL pCtl3dState _afxCtl3dState.GetDataNA NULL pCtl3dState-m_pfnSubclassDlgEx NULL dwFlags AfxCallWndProcpWndInit hWnd WM_QUERY3DCONTROLS 0// was the class registered with AfxWndProcWNDPROC afxWndProc AfxGetAfxWndProc函数见后BOOL bAfxWndProc WNDPROCGetWindowLonghWnd GWL_WNDPROC afxWndProcpCtl3dState-m_pfnSubclassDlgExhWnd dwFlags// subclass the window if not already wired to AfxWndProcif bAfxWndProc// subclass the window with standard AfxWndProcoldWndProc WNDPROCSetWindowLonghWnd GWL_WNDPROCDWORDafxWndProc // 修改窗口的 WndProcASSERToldWndProc NULLpOldWndProc oldWndProcelseendif// subclass the window with standard AfxWndProcWNDPROC afxWndProc AfxGetAfxWndProcoldWndProc WNDPROCSetWindowLonghWnd GWL_WNDPROCDWORDafxWndProc
上一篇:
远程读写游戏内存VC带源码
下一篇:
倒着看世界