【问题标题】:Trapping messages in MFC - Whats the difference?在 MFC 中捕获消息 - 有什么区别?
【发布时间】:2010-09-17 01:33:33
【问题描述】:

我只是想知道 MFC 中以下两个用于函数 OnSize(..) 的消息陷阱之间有什么区别(如果有的话)。

1 - 通过消息映射:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
    ON_WM_SIZE()
..
END_MESSAGE_MAP()

2 - 通过 afx_message:

afx_msg type OnSize(...);

它们似乎可以互换使用,应该使用哪一个还是取决于其他因素?

【问题讨论】:

    标签: c++ windows mfc messages


    【解决方案1】:

    这两个部分都是向类添加消息处理程序所必需的。消息映射应与任何消息处理函数的声明一起在您的类中声明(例如,OnSize)。

    class CClassWnd : public CBaseClassWnd {
        ...
        afx_msg void OnSize(UINT nType, int cx, int cy);
        DECLARE_MESSAGE_MAP
    };
    

    afx_msg 只是一个空的占位符宏 - 它实际上并没有做任何事情,但总是按照惯例包含在内。

    然后在类的 .cpp 文件中定义消息映射:

    BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
        ON_WM_SIZE()
    END_MESSAGE_MAP()
    

    这些宏为类生成一个查找表,允许将窗口接收到的消息分派到相应的处理函数。 ON_WM_SIZE 宏允许将 WM_SIZE 消息中的 wParamlParam 消息参数解码为消息处理函数的更有意义的值(在这种情况下为nTypecxcy )。 MFC 为大多数窗口消息(WM_LBUTTONDOWNWM_DESTROY 等)提供宏。

    您可以在 MSDN 上找到有关消息映射如何在 MFC here 中工作的更多信息。

    【讨论】:

      【解决方案2】:

      afx_msg 只是一个空宏,它基本上只是为了表示该方法是一个 MFC 消息处理程序,以提高可读性。即使有 afx_msg ,您仍然需要在消息映射中有一个条目。

      【讨论】:

      • 很高兴知道这一点,我一直想知道这一点。也许我只是有太多时间在我手上...... ;)
      【解决方案3】:

      MFC 已经处理了一些 Windows 消息,因此在这些情况下,您可以只将方法添加到派生类中。

      例如 CWnd 类(与许多其他 MFC 类一样)已经将一些 Windows 消息映射到它的消息映射中(即 ON_WM_DRAWITEMON_WM_MEASUREITEM em>、ON_WM_ENTERIDLE 等)。

      但任何其他尚未被 MFC 映射的消息都需要在消息映射中同时具有类方法和条目才能工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 2018-11-15
        • 2018-08-04
        • 2015-10-23
        • 1970-01-01
        • 2015-10-02
        相关资源
        最近更新 更多