在MFC中捕获消息-有什么区别
Trapping messages in MFC - Whats the difference?
我只是想知道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
等)提供宏。
您可以在MSDN上找到有关消息映射在MFC中如何工作的更多信息。
afx_msg只是一个空宏,它基本上只是用来表示该方法是一个MFC消息处理程序,以便于阅读。即使有afx_msg,你仍然需要在消息映射中有一个条目。
一些Windows消息已经由MFC处理,因此在这些情况下,您可以只将方法添加到派生类中。
例如,CWnd类(与许多其他MFC类一样)已经将一些Windows消息映射到其消息映射中(即ON_WM_DRAWTITEM、ON _WM_MEASURETITEM、ON _WM_ENTERIDL等)。
但是,任何其他尚未由MFC映射的消息都需要同时具有类方法和消息映射中的条目才能工作。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?