关于MFC里面的宏,请高手指点
刚开始在自学MFC,正在看候俊杰的《深入浅出MFC》,在学到“MFC六大关键技术之仿真”时,看到那么多复杂的宏感觉头都大了,在学C++时,只接触到一些简单的宏,也就是把宏...
刚开始在自学MFC,正在看候俊杰的《深入浅出MFC》,在学到“MFC六大关键技术之仿真”时,看到那么多复杂的宏感觉头都大了,在学C++时,只接触到一些简单的宏,也就是把宏展开也就是一行代码,而且给人的感觉宏就是文字替换,可MFC里面的宏对我来说就太难了,下面这些宏就是这本书里仿真消息映射的机制,请各位前辈们帮小弟解释一下这些宏到底是怎么动作的,非常感谢!
struct AFX_MSGMAP_ENTRY;
struct AFX_MSGMAP{
AFX_MSGMAP* pBaseMessageMap;
AFX_MSGMAP_ENTRY* lpEntries;
};
#define DECLARE_MESSAGE_MAP() \
static AFX_MSGMAP_ENTRY _messageEntries[]; \
static AFX_MSGMAP messageMap; \
virtual AFX_MSGMAP* GetMessageMap() const;
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_MSGMAP theClass::messageMap = \
{ &(baseClass::messageMap), \
(AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; \
AFX_MSGMAP_ENTRY theClass::_messageEntries[] = {
#define END_MESSAGE_MAP() { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } }; 展开
struct AFX_MSGMAP_ENTRY;
struct AFX_MSGMAP{
AFX_MSGMAP* pBaseMessageMap;
AFX_MSGMAP_ENTRY* lpEntries;
};
#define DECLARE_MESSAGE_MAP() \
static AFX_MSGMAP_ENTRY _messageEntries[]; \
static AFX_MSGMAP messageMap; \
virtual AFX_MSGMAP* GetMessageMap() const;
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_MSGMAP theClass::messageMap = \
{ &(baseClass::messageMap), \
(AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; \
AFX_MSGMAP_ENTRY theClass::_messageEntries[] = {
#define END_MESSAGE_MAP() { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } }; 展开
1个回答
展开全部
对照着看吧,书上说的非常清楚了。
基本是对每一个类设置一些静态成员(CRunTimeClass结构体,组成链表对生成的类信息串起来),消息表(AFX_MSGMAP 结构体数组)。
BEGIN_MESSAGE_MAP声明了静态数组存放消息和对应函数,当然还有其他信息。
之间的ON_WM_XXX都是数组元素。
定义宏 END_MESSAGE_MAP是用来结束数组。AfxSig_end用来标识结束数组。
新的MFC,比如MFC9.0里GetMessageMap不是虚函数,而是加了一个GetThisMessageMap.
GetMessageMap调用GetThisMessageMap,本类的GetThisMassageMap返回的是一个结构体,第一个是父类的GetThisMessageMap函数指针,第二个是自己类的消息表。从而对于派生类的消息,可以把所有覆盖的消息全部得到。有点递归的意思。
消息表用来以后查询消息对应的处理函数。
某些静态成员则是用来动态创建对象的,即不知道类名却可以得到它的对象。
宏只是用来替换,掩人耳目或者说一些类都需要相同形式的东西,写成宏更简洁。
自己认真看,侯俊杰sir的写作水平很强,否则很多人懂,但为什么就他书卖的最好最热了。
基本是对每一个类设置一些静态成员(CRunTimeClass结构体,组成链表对生成的类信息串起来),消息表(AFX_MSGMAP 结构体数组)。
BEGIN_MESSAGE_MAP声明了静态数组存放消息和对应函数,当然还有其他信息。
之间的ON_WM_XXX都是数组元素。
定义宏 END_MESSAGE_MAP是用来结束数组。AfxSig_end用来标识结束数组。
新的MFC,比如MFC9.0里GetMessageMap不是虚函数,而是加了一个GetThisMessageMap.
GetMessageMap调用GetThisMessageMap,本类的GetThisMassageMap返回的是一个结构体,第一个是父类的GetThisMessageMap函数指针,第二个是自己类的消息表。从而对于派生类的消息,可以把所有覆盖的消息全部得到。有点递归的意思。
消息表用来以后查询消息对应的处理函数。
某些静态成员则是用来动态创建对象的,即不知道类名却可以得到它的对象。
宏只是用来替换,掩人耳目或者说一些类都需要相同形式的东西,写成宏更简洁。
自己认真看,侯俊杰sir的写作水平很强,否则很多人懂,但为什么就他书卖的最好最热了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询