网站大量收购独家精品文档,联系QQ:2885784924

VC学习分析MFC中的映射.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
VC学习分析MFC中的映射

VC++学习:分析MFC中的映射 作者:jiangsheng/CSDN ??? 条件查找映射 ? MFC中大量使用了BEGIN_XXX_MAP这样的宏,以及映射进行查找优化,例如消息映射,OLE命令映射,以及接口等等。每个映射包含一个指向基类的映射的指针。这样,当一个类需要根据一定的条件查找一个对象时,它会查找本类对象,如果没有找到,那么会查找基类,直到根基类。这类查找包含Windows消息,命令,事件和OLE命令的分发,和对象实现的接口的查询等等。 ? 下面是函数BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)的部分代码,演示了如何根据消息的ID查找处理函数。 ? const AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap(); ? UINT iHash; iHash = (LOWORD((DWORD_PTR)pMessageMap) ^ message) (iHashMax-1); ? AfxLockGlobals(CRIT_WINMSGCACHE); ? AFX_MSG_CACHE* pMsgCache; pMsgCache = _afxMsgCache[iHash]; ? const AFX_MSGMAP_ENTRY* lpEntry; ? if (message == pMsgCache-nMsg pMessageMap == pMsgCache-pMessageMap) ? { ? // cache hit ? lpEntry = pMsgCache-lpEntry; ? AfxUnlockGlobals(CRIT_WINMSGCACHE); ? if (lpEntry == NULL) ? return FALSE; ? // cache hit, and it needs to be handled ? if (message 0xC000) ? goto LDispatch; ? else ? goto LDispatchRegistered; ? } ? else ? { ? // not in cache, look for it ? pMsgCache-nMsg = message; ? pMsgCache-pMessageMap = pMessageMap; ? #ifdef _AFXDLL ? for (/* pMessageMap already inited */; pMessageMap-pfnGetBaseMap != NULL; ? pMessageMap = (*pMessageMap-pfnGetBaseMap)()) ? #else ? for (/* pMessageMap already inited */; pMessageMap != NULL; ? pMessageMap = pMessageMap-pBaseMap) ? #endif ? { ? // Note: catch not so common but fatal mistake!! ? // BEGIN_MESSAGE_MAP(CMyWnd, CMyWnd) ? #ifdef _AFXDLL ? ASSERT(pMessageMap != (*pMessageMap-pfnGetBaseMap)()); ? #else ? ASSERT(pMessageMap != pMessageMap-pBaseMap); ? #endif ? if (message 0xC000) ? { ? // constant window message ? if ((lpEntry = AfxFindMessageEntry(pMessageMap-lpEntries, ? message, 0, 0)) != NULL) ? { ? pMsgCache-lpEntry = lpEntry; ? AfxUnlockGlobals(CRIT_WINMSGCACHE); ? goto LDispatch; ? } ? } ? else ? { ? // registered windows message ? lpEntry = pMessageMap-lpEntries; ? while ((lpEntry = AfxFindMessageEntry(lpEntry, 0xC000, 0, 0)) != NULL) ? { ? UINT* pnID = (UINT*)(lpEntry-nSig); ? ASSERT(*pnID = 0xC

文档评论(0)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档