您的位置:首页 > 其它

090907(星期一)项目进展:学习MFC的消息映射

2009-09-07 20:49 447 查看
一、MFC消息映射
1 Message Mapping中重要的数据结构
l AFX_MSGMAP
struct AFX_MSGMAP
{
AFX_MSGMAP* pBaseMessageMap; //指向其基类MessageMap的指针,串化及上溯Message

AFX_MSGMAP_ENTRY* lpEntries; //Message Mapping的节点
};

l AFX_MSGMAP_ENTRY
struct AFX_MSGMAP_ENTRY // MFC 4.0
{
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
};

l AFX_PMSG
typedef void (CCmdTarget::*AFX_PMSG)(void); //前面加上CCmdTarget:: 表示所指函数属于该类

2 Message Mapping中重要的宏
l DECLARE_MESSAGE_MAP()
#define DECLARE_MESSAGE_MAP() / //用在类的Declear之中
static AFX_MSGMAP_ENTRY _messageEntries[]; / //给类加一个static的数组变量
static AFX_MSGMAP messageMap; / //给类加一个static 的messageMap变量
virtual AFX_MSGMAP* GetMessageMap() const; //给类加一个返回messageMap的Get函数

l BEGIN_MESSAGE_MAP(theClass, baseClass)
#define BEGIN_MESSAGE_MAP(theClass, baseClass) / //用于实现,.cpp中
AFX_MSGMAP* theClass::GetMessageMap() const / //实现该类的Get MessageMap函数
{ return &theClass::messageMap; } /
AFX_MSGMAP theClass::messageMap = /
{ &(baseClass::messageMap), / //对messageMap属性赋值,第一参数是改类父类的messageMap属性
(AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; / //把自己的一个数据变量_messageEntries[]这个数组的指针给messageMap作为第二个变量值
AFX_MSGMAP_ENTRY theClass::_messageEntries[] = /
{ //对该类的_messageEntries[]数组赋值,以下将马上有ON_COMMAND宏装载其他的Message handle函数

l ON_COMMAND(id, memberFxn)
#define ON_COMMAND(id, memberFxn) / //用于实现,.cpp中,添加到该类的_messageEntries[]数组中,各种命令的添加就在这儿
{ WM_COMMAND, 0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memberFxn },

l END_MESSAGE_MAP()
#define END_MESSAGE_MAP() / //是上面两个宏的结尾,用于循环的结束
{ 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } /
};

3 对Message Mapping用法的理解,优点的体会,以及MFC处理思想的学习
每个类利用宏定义的一个静态的属性static AFX_MSGMAP_ENTRY _messageEntries[]
来保存记录它要处理的命令,而且另一个静态的属性static AFX_MSGMAP messageMap 还有该类父类的messageMap指针,以便上溯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: