- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- CoreJava技术总结.doc
- DJ40120步履式单导梁架桥机组装工艺优化及电气系统.doc
- DOM操作的方法.doc
- DotNET性能优化方面的总结.doc
- DSP课程设计一种块递推实时FFT算法模块设计与实现.doc
- DVD伺服工作原理.doc
- e抗原在病毒感染中的意义[精华].doc
- FAT32与FAT16的区别及FAT32结构.docx
- Fat,Fat32和NTFS之间的区别.docx
- FC SAN和IP SAN的比较.doc
- 2023重庆科创职业学院招聘笔试真题及参考答案详解1套.docx
- 2023毕节医学高等专科学校招聘笔试真题及参考答案详解一套.docx
- 2023西安外事学院招聘笔试真题及参考答案详解一套.docx
- 2023河南对外经济贸易职业学院招聘笔试真题参考答案详解.docx
- 2023河南测绘职业学院招聘笔试真题带答案详解.docx
- 2023衡阳幼儿师范高等专科学校招聘笔试真题及答案详解一套.docx
- 2023河北司法警官职业学院招聘笔试真题附答案详解.docx
- 2023湖南汽车工程职业学院招聘笔试真题带答案详解.docx
- 2023湖南艺术职业学院招聘笔试真题附答案详解.docx
- 2023湖北幼儿师范高等专科学校招聘笔试真题及答案详解1套.docx
文档评论(0)