5

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

1 - 通过消息映射:

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

2 - 通过 afx_message:

afx_msg type OnSize(...);

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

4

3 回答 3

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宏允许将消息中的wParamlParammessage 参数WM_SIZE解码为对消息处理函数更有意义的值(在本例中为nType,cxcy)。MFC 为大多数窗口消息(、、等)提供WM_LBUTTONDOWNWM_DESTROY

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

于 2008-10-14T10:22:48.630 回答
3

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

于 2008-10-14T09:54:17.313 回答
0

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

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

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

于 2008-10-15T03:51:00.853 回答