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

  • 相关阅读:
    【转载】[030]◀▶ ArcEngine 一些实现代码
    C#获取FTP目录下文件夹、文件的方法,进而判断FTP下指定文件夹是否存在
    C# 命名空间"DevExpress.XtraReports.UserDesigner"中不存在类型或命名空间名称"XRTabbedMdiManager"。是否缺少程序集引用?
    C#欢迎界面的两种形式
    RibbonForm中Text显示不完整
    IDL波段分解与合成源代码
    Java多线程--synchronized(二)
    Java多线程--synchronized(一)
    Java多线程--基础(三)
    Java多线程--基础(二)
  • 原文地址:https://www.cnblogs.com/revercc/p/15550262.html
Copyright © 2011-2022 走看看