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

Trapping messages in MFC - Whats the difference?

本文关键字:什么 区别 消息 MFC      更新时间:2023-10-16

我只是想知道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消息中的wParamlParam消息参数解码为消息处理程序函数的更有意义的值(在这种情况下为nTypecxcy)。MFC为大多数窗口消息(WM_LBUTTONDOWNWM_DESTROY等)提供宏。

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

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

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

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

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