MFC中的消息处理函数


1、在Windows API编程中,直接在消息处理函数中编写WM_PAINT处理代码。

2、在MFC中,CFrameWnd的消息处理过程在哪里呢?MFC时如何将消息处理函数和窗口关联起来的。

  在CFrameWnd::CreateEx中,调用PreCreateWindows来注册窗口。

  AfxDefRegisterClass(AFX_WNDFRAMEORVIEW_REG):注册一个固定的窗口类,这个窗口类中的消息处理过程时一个固定的消息处理过程,

  真正将我门的消息处理过程CWnd::WindowProc和我们的窗口进行关联的代码在AfxHookWindowCreate(this)函数中。

  CFrameWnd::CreateEx中,调用AfxHookWindowCreate(this),将窗口类CFrameWnd::WindowProc的消息处理过程和CFrameWnd窗口进行关联。

  AfxHookWindowCreate(this)

  ::SetWindowsHookEx(WH_CBT, _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());

  这个函数在线程中,埋下一个钩子,

  找到钩子函数,_AfxCbtFileterHook,在钩子函数中下一个断点。

    在_AfxCbtFileterHook中,调用SetWindowLongPtr(hWnd, GWLP_WNDPROC, (DWORD_PTR)afxWndProc);

    将我们创建的窗口pFrame和afxWndProc窗口处理过程和关联(afxWndProc是MFC中的一个统一消息处理过程)

  AfxWndProc调用AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);

  AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam)调用pWnd->WindowProc(nMsg, wParam, lParam);

3、CFrameWnd是一个窗口,那么这个类中,包含了消息处理函数,这个消息处理函数继承自CWnd。

4、在CWnd中存在以下的这个函数,该函数就是消息处理函数。

virtual LRESULT WindowProc(
    UINT message,  
    WPARAM wParam,  
    LPARAM lParam);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM