在MFC中捕获消息 - 有什么区别?

时间:2008-10-14 09:46:02

标签: c++ windows mfc messages

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

1 - 通过消息映射:

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

2 - 通过afx_message:

afx_msg type OnSize(...);

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

3 个答案:

答案 0 :(得分:12)

这两个部分都是向类添加消息处理程序所必需的。消息映射应该在类中声明,以及任何消息处理函数的声明(例如,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宏允许将wParam消息中的lParamWM_SIZE消息参数解码为消息处理函数的更有意义的值(nType,{ {1}},在这种情况下为cx。 MFC为大多数窗口消息(cyWM_LBUTTONDOWN等)提供宏。

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

某些Windows消息已由 MFC 处理,因此在这些情况下,您只需将方法添加到派生类即可。

例如 CWnd 类(和许多其他MFC类一样)已经将一些Windows消息映射到它的消息映射中(即 ON_WM_DRAWITEM ON_WM_MEASUREITEM ON_WM_ENTERIDLE 等等)。

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