• MFC消息处理


    MFC是对Windows API的封装,其在底层也将windows API的消息处理给封装了。

    MFC利用HOOK对消息的处理进行了拦截

    如果我们不设置窗口的窗口处理过程,那么窗口产生的消息默认都会给DefWindowProc()函数处理。我们在MFC中利用Cwnd的Create函数创建窗口时都没有提供窗口处理过程,那么难道MFC窗口的消息都传递给了DefWindowProc函数处理了?答案肯定是NO,因为我们在MFC中可以利用消息映射处理消息,所以肯定有一个"自定义的消息处理过程"的存在。

    上述代码我们可以看到,当我们在Cwnd子类中调用Cwnd::CreateEx创建窗口时,此函数在创建窗口的同时还会调用AfxHookWindowCreate()

    AfxHookWindowCreate函数会继续调用SetWindowsHookEx设置WM_CBT消息钩子,钩子的回调例程为AfxCbtFilterHook()函数。也就是每次当有消息产生时,在消息到达消息循环前会先调用此消息回调例程AfxCbtFilterHook()函数。

    之后AfxCbtFileterHook会调用SetWIndowLongPtr函数设置窗口回调过程为AfxWndProc,因为所有窗口产生消息是都会调用此HOOK设置窗口回调,所以AfxWndProc函数时所有MFC窗口的公共消息处理过程。

    消息是如何一步一步到达各个类的消息映射处理的

    所有的消息先到达消息循环后,都会进一步到公共的消息处理过程AfxWndProc函数中,此函数会调用CWnd::FromHandlePermanent()函数来获得对应窗口的Cwnd*,之后调用AfxCallWndProc()。

    AfxCallWndProc函数会调用对应Cwnd的WindowProc函数,将消息传递给此函数处理。

    CWnd::WindowProc()函数接着调用OnWndMsg(),消息传递到OnWndMsg。

    之后在CWnd::OnWndMsg()函数中进行处理,部分消息直接调用对应的消息处理函数,例如WM_COMMAND消息用OnCommand函数处理,而此函数在子类中已经被覆盖,所以消息就会被子类的消息映射对应的OnCommand函数处理(MFC的命令传递机制)。

    其余消息CWnd::OnWndMsg()函数利用消息映射处理,沿着各个消息映射表链进行传递处理。

  • 相关阅读:
    HDU5446 Unknown Treasure
    C语言课设——通讯录操作系统
    判断设备是否横屏
    禁止用户横屏
    用javascript编写ps脚本
    用户鼠标指针的样式
    如何使用typescript开发node(自动编译,自动重启)
    CSS3:box-sizing:不再为匣子模型而烦恼
    命令行开启自动编译scss(webstrom可开启自动编译)
    TypeError: Cannot read property 'replace' of undefined ----angular2
  • 原文地址:https://www.cnblogs.com/revercc/p/15550262.html
Copyright © 2020-2023  润新知