关于MFC的一个初学者有关问题,求高手解答

关于MFC的一个菜鸟问题,求高手解答
学习侯老师的《深入浅出MFC》,关于仿真MFC消息地图中,有如下代码:
struct AFX_MSGMAP_ENTRY
{
AFX_MSGMAP *pbasemessagemap;
AFX_MSGMAP_ENTRY* pentries;
};
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT nSig;
AFX_PMSG pfn;
};
#define DECLARE_MESSAGE_MAP()\
static AFX_MSGMAP_ENTRY _messageentries[];\
static AFX_MSGMAP messagemap;\
virtual AFX_MSGMAP* getmessagemap()const;
#define BEGINE_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::_message_messageentries[]=\
{
#define END_MSGMAP()\
{0,0,0,0,AfxSig_end,(AFX_PMSG)0}\
};
#define ON_COMMAD(id,memberFxn)\
{WM_COMMAND,0,(WORD)id,(WORD)id,AfxSig_end,(AFX_PMSG)0}
};
这些都没问题 ,问题在于后面加了一个
typedef void(CCmdtarget::*AFX_PMSG)(void);
把AFX_PMSG定义为一个函数指针,而按照宏定义,AFX_PMSG为消息结构体AFX_MSGMAP_ENTRY的成员,而CCmdtarget
这个类并没有函数指针成员, CCmdtarget::*AFX_PMSG这条从何而来?求解答。 




------解决思路----------------------
typedef void(*AFX_PMSG)(void); 表示全局函数指针 类型  (注意,AFX_PMSG是自定义的类型)
typedef void(CCmdtarget::*AFX_PMSG)(void); 表示CCmdtarget对象函数指针 类型
AFX_PMSG pfn; 表示AFX_PMSG类型的pfn变量

BEGINE_MESSAGE_MAP 宏简化下
#define BEGINE_MESSAGE_MAP(theclass,baseclass)\
 AFX_MSGMAP_ENTRY theclass::_message_messageentries[]=\
 {

配合
#define END_MSGMAP()\
 {0,0,0,0,AfxSig_end,(AFX_PMSG)0}\
 };

发现定义了一个数组,并且初始化了几个成员。


#define ON_COMMAD(id,memberFxn)\
 {WM_COMMAND,0,(WORD)id,(WORD)id,AfxSig_end,(AFX_PMSG)memberFxn}
这个宏就是创建上面数组的一个成员,把memberFxn 付给 AFX_MSGMAP_ENTRY :: pfn变量

而我们写mfc程序时,自定义的CListDlg对话框中,在MSG MAP中能看到ON_COMMAND(ID_BUTTON_OPEN, OnFileOpen)

可以看到 AFX_MSGMAP_ENTRY :: pfn变量就是 CListDlg::OnFileOpen()函数。