题
我只是想知道MFC中以下两个消息陷阱之间的区别是什么(如果有的话)OnSize(..)。
1 - 通过消息映射:
BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
ON_WM_SIZE()
..
END_MESSAGE_MAP()
2 - 通过afx_message:
afx_msg type OnSize(...);
它们似乎可以互换使用,应该使用哪一个还是依赖于其他因素?
解决方案
这两个部分都是向类添加消息处理程序所必需的。消息映射应该在类中声明,并与任何消息处理函数的声明一起声明(例如, 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
消息中的 wParam
和 lParam
消息参数解码为更有意义的值消息处理函数(在这种情况下为 nType
, cx
和 cy
)。 MFC为大多数窗口消息提供宏( WM_LBUTTONDOWN
, WM_DESTROY
等)。
您可以在MFC中找到有关消息地图如何工作的更多信息此处在MSDN上。
其他提示
afx_msg只是一个空宏,它基本上只是表示该方法是一个MFC消息处理程序,用于可读性目的。即使使用afx_msg,您仍然需要在消息映射中有一个条目。
某些Windows消息已由 MFC 处理,因此在这些情况下,您只需将方法添加到派生类即可。
例如 CWnd 类(和许多其他MFC类一样)已经将一些Windows消息映射到它的消息映射中(即 ON_WM_DRAWITEM , ON_WM_MEASUREITEM , ON_WM_ENTERIDLE 等等)。
但是MFC尚未映射的任何其他消息都需要在消息映射中同时具有类方法和条目才能使其正常工作。
不隶属于 StackOverflow