关于MFC深入浅出第三章关键技术仿真的问题
在仿真消息映射的时候,小弟有个问题不是很清楚,希望大家帮助,问题是这样的,在#defineBEGIN_MESSAGE_MAP(theClass,baseClass)\AF...
在仿真消息映射的时候,小弟有个问题不是很清楚,希望大家帮助,问题是这样的,在
#define BEGIN_MESSAGE_MAP(theClass,baseClass) \
AFX_MSGMAP* theClass::GetMessageMap()....\ 省略部分
AFX_MSGMAP_ENTRY theClass::_messageEntries[]={
#define ON_COMMAND(id,memberFxn) \
{WM_COMMAND,0,(WORD)id,(WORD)id,AfxSig_vv,(AFX_MSG)memberFxn}
#define END_MESSAGE_MAP()
{0,0,0,0,AfxSig_end,(AFX_MSG)0}
}
AFX_MSGMAP_ENTRY 是个结构体名,我想知道为什么构建消息网的时候是写
BEGIN_MESSAGE_MAP(theClass,baseClass)
ON_COMMAND(id,memberFxn)
END_MESSAGE_MAP()
这个ON_COMMAND(id,memberFxn) 和END_MESSAGE_MAP()宏不是在BEGIN_MESSAGE_MAP中有了的吗?
再说了,这写在BEGIN_MESSAGE_MAP下为什么就能写到对应的结构体数组中?而且MFC消息不是可以有多个的那么当出现
BEGIN_MESSAGE_MAP(theClass,baseClass)
ON_COMMAND(id,memberFxn)
ON_COMMAND(id,memberFxn)
END_MESSAGE_MAP()
多几个命令的时候又是怎么实现的?
这些问题我想了一下午了还解决不了,希望大家帮帮忙,谢谢~~~
BEGIN_MESSAGE_MAP(CView,CWnd)
ON_COMMAND(CViewid,0)
END_MESSAGE_MAP()
被展开后:
省略部分。。
AFX_MSGMAP_ENTRY CView::messageEntries[]={
{WM_COMMAND,0,(WORD)122,(WORD)122,1,(AFX_PMSG)0},
{0,0,0,0,0,(AFX_PMSG)}
};
这个ON_COMMAND(CViewid,0)和END_MESSAGE_MAP()写在BEGIN_MESSAGE_MAP(CView,CWnd)的下面,为什么在CView::messageEntries[]中会有其值? 展开
#define BEGIN_MESSAGE_MAP(theClass,baseClass) \
AFX_MSGMAP* theClass::GetMessageMap()....\ 省略部分
AFX_MSGMAP_ENTRY theClass::_messageEntries[]={
#define ON_COMMAND(id,memberFxn) \
{WM_COMMAND,0,(WORD)id,(WORD)id,AfxSig_vv,(AFX_MSG)memberFxn}
#define END_MESSAGE_MAP()
{0,0,0,0,AfxSig_end,(AFX_MSG)0}
}
AFX_MSGMAP_ENTRY 是个结构体名,我想知道为什么构建消息网的时候是写
BEGIN_MESSAGE_MAP(theClass,baseClass)
ON_COMMAND(id,memberFxn)
END_MESSAGE_MAP()
这个ON_COMMAND(id,memberFxn) 和END_MESSAGE_MAP()宏不是在BEGIN_MESSAGE_MAP中有了的吗?
再说了,这写在BEGIN_MESSAGE_MAP下为什么就能写到对应的结构体数组中?而且MFC消息不是可以有多个的那么当出现
BEGIN_MESSAGE_MAP(theClass,baseClass)
ON_COMMAND(id,memberFxn)
ON_COMMAND(id,memberFxn)
END_MESSAGE_MAP()
多几个命令的时候又是怎么实现的?
这些问题我想了一下午了还解决不了,希望大家帮帮忙,谢谢~~~
BEGIN_MESSAGE_MAP(CView,CWnd)
ON_COMMAND(CViewid,0)
END_MESSAGE_MAP()
被展开后:
省略部分。。
AFX_MSGMAP_ENTRY CView::messageEntries[]={
{WM_COMMAND,0,(WORD)122,(WORD)122,1,(AFX_PMSG)0},
{0,0,0,0,0,(AFX_PMSG)}
};
这个ON_COMMAND(CViewid,0)和END_MESSAGE_MAP()写在BEGIN_MESSAGE_MAP(CView,CWnd)的下面,为什么在CView::messageEntries[]中会有其值? 展开
1个回答
展开全部
你这个,其实就是只看MFC,不看SDK编程的一个弊端。
MFC框架的很多东西,会让人开始学习的时候很迷糊,其实这个消息映射,就是通过宏定义给框架一个解析入口,是一个“消息ID号”和“处理函数”的对应关系表。
从代码阅读上,能比较清晰的看出消息对应关系,但在代码理解上,因为各种宏定义和类处理的封装,初学很容易被绕迷糊。
其实BEGIN_MESSAGE_MAP这个宏,就是一个类成员函数,而成员函数封装了消息环处理罢了,
而BEGIN_MESSAGE_MAP(theClass,baseClass),实际就是组合了三个消息声明函数的宏,具体实现是这样(宏定义稍微复杂,但找到定义出仔细看还是能看明白)
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \
看出来了吗?其实就是一个函数头,还带着左边大括号“{",而End那个,对应的就是右边大括号"}",就是组合了三个函数定义一个消息映射入口,而多个ON_COMMAND,相当于第三个函数(其实不是函数,是定义)的实现内容(其实是结构定义,呵呵)。
至于多个命令,当然是因为消息ID不同,对应了不同的处理函数(这里注意同一个窗口内消息号唯一不可重复,而不同窗口的ID可以相同)
更多追问追答
追问
多个ON_COMMAND,相当于第三个函数(其实不是函数,是定义)的实现内容(其实是结构定义,呵呵)。在这之前我都是理解的,我下面我看不懂,而且我想知道的是为什么多几个ON_COMMAND(id,memberFxn),messageEntries[]里就可以多几个数据了?
追答
你理解什么是宏么,宏,其实就是代码替换,就是在编译之前,宏会被define的代码代替才编译。
这里面,几乎都是宏,包括ON_COMMAND,甚至包括ID。
messageEntries有一个还是一百个无所谓,只是窗口中接受到消息的时候,去messageEntries里面去匹配消息号,匹配了,就找对应的memberFxn去响应,没有匹配,就过了(没有代码被执行),如此而已,这个其实是SDK编程中while消息环的另类实现方法。
messageEntries[]可以理解为不定长的数组(其实就是,呵呵)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询