一个消息要同时映射给两个函数,在VC++里基本做不到,
你说的这个概念有点像C#语言里的Delegate,C#本身有语法支持可以做到同时管理多个处理者,
但C++里的Delegate只能通过回调函数的方式实现,
而且更关键的是,C++里很难做到同时关联多个回调函数(除非自己实现);
MFC里的ON_MESSAGE是一个宏,
这个宏可以简单的理解为如下的代码:
程序代码:
#define ON_MESSAGE(message, memberFxn) \
{ \
message, 0, 0, 0, AfxSig_lwl, \
AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn \
},
而在实际运行的时候,
运行过程也可以入下理解:
程序代码:
int i;
for(i=0; i < dim(_messageEntries); i++)
{
if (message == _messageEntries[i].nMessage)
return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
也就是说,
虽然你定义了
ON_MESSAGE(MYMESSAGE,MyMemberFun)
ON_Message(MYMESSAGE,MyFun2)
但是当系统收到MYMESSAGE消息时,
一旦找到MyMemberFun函数,
则执行完后就返回了,
而不会再继续去进行下一次的查找,
因此MyFun2自然也就执行不到;
所以,
要实现你的功能,
比较简单的办法就是:
首先,
自己定义一个回调函数的列表MyArray,
在该列表里可以保存多个处理函数的指针,
其次,
定义 ON_MESSAGE(MYMESSAGE,EntryFun);
最后,
在EntryFun函数里,
遍历MyArray列表,依次调用处理函数;
你可以去看看《深入浅出MFC》,上面对MFC的消息的处理有很透彻的分析。
上面的部分代码也是从上面复制下来的。
[
本帖最后由 kwbplcz 于 2010-11-3 16:34 编辑 ]