正在阅读:分析MFC中的映射分析MFC中的映射

2004-04-02 10:19 出处:CSDN 作者:jiangsheng 责任编辑:sdq

  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 >= 0xC000 || *pnID == 0);
  // must be successfully registered
  if (*pnID == message)
  {
  pMsgCache->lpEntry = lpEntry;
  AfxUnlockGlobals(CRIT_WINMSGCACHE);
  goto LDispatchRegistered;
  }
  lpEntry++; // keep looking past this one
  }
  }
  }

  pMsgCache->lpEntry = NULL;
  AfxUnlockGlobals(CRIT_WINMSGCACHE);
  return FALSE;
  }

  LDispatch:

  注意:
  1.对查找结果的缓存可以提高查找的效率。
  2.不要被MFC起的名字欺骗了,从数据结构上来说,查找是顺序的,而不是使用CMap类使用的散列技术,所以使用散列技术,缓存最近的查找结果和把最常用的映射项放在最前面通常有助于提高效率。
  使用查找映射的好处是,可以方便地在派生类中扩展和覆盖映射(例如重新实现IDispatch),而不用重写/重载查找函数(消息和命令的分发,或者接口的查询);也可以不使用对资源消耗很大的虚函数表。(尽管如此,CWnd类还是有无数个虚函数,并且不出意外地看到,在MFC6到MFC7的升级中又有增加)
  使用查找映射的坏处么,当然是理解上的问题和性能上的损失了。

察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品