zoukankan      html  css  js  c++  java
  • 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()函数利用消息映射处理,沿着各个消息映射表链进行传递处理。

  • 相关阅读:
    Web安全测试检查点
    "Could not resolve host: mirrorlist.centos.org; Unknown error"解决方法
    VMware vSphere Client中启动虚拟机提示No boot filename received/Operating System not found解决方法
    Android:Mstar Android8.0平台音量控制流程
    Android:系统自定义鼠标样式切换
    Android:系统日历添加默认账户
    Android:状态栏禁用时蓝牙多文件传输弹窗及进度显示
    Android:导入所需的系统jar包到Android studio
    Android:修改连接到AP端显示的设备名
    Android:StateMachine 之 WifiStateMachine
  • 原文地址:https://www.cnblogs.com/revercc/p/15550262.html
Copyright © 2011-2022 走看看