按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#0037 else
#0038 goto LDispatchRegistered;
#0039 }
#0040 else
#0041 {
#0042 // not in cache; look for it
#0043 msgCache。nMsg = message;
#0044 msgCache。pMessageMap = pMessageMap;
#0045
#0046 for (/* pMessageMap already init'ed */; pMessageMap != NULL;
#0047 pMessageMap = pMessageMap…》pBaseMap)
#0048 {
#0049 //利用AfxFindMessageEntry 寻找消息映射表中
#0050 //对应的消息处理例程。如果找到,再依nMsg 为一般消息
#0051 // (《 0xC000)或自行注册之消息(》 0xC000)分别跳到
#0052 // LDispatch: 或LDispatchRegistered: 去执行。
#0053
#0054 // Note: catch not so mon but fatal mistake!!
#0055 // BEGIN_MESSAGE_MAP(CMyWnd; CMyWnd)
#0056
#0057 if (message 《 0xC000)
#0058 {
568
…………………………………………………………Page 631……………………………………………………………
第9章 訊息映射與命令繞行
#0059 // constant window message
#0060 if ((lpEntry = AfxFindMessageEntry (pMessageMap…》lpEntries;
#0061 message; 0; 0)) != NULL)
#0062 {
#0063 msgCache。lpEntry = lpEntry;
#0064 goto LDispatch;
#0065 }
#0066 }
#0067 else
#0068 {
#0069 // registered windows message
#0070 lpEntry = pMessageMap…》lpEntries;
#0071 while ((lpEntry = AfxFindMessageEntry (lpEntry; 0xC000; 0; 0))
#0072 != NULL)
#0073 {
#0074 UINT* pnID = (UINT*)(lpEntry…》nSig);
#0075 ASSERT(*pnID 》= 0xC000);
#0076 // must be successfully registered
#0077 if (*pnID == message)
#0078 {
#0079 msgCache。lpEntry = lpEntry;
#0080 goto LDispatchRegistered;
#0081 }
#0082 lpEntry++; // keep looking past this one
#0083 }
#0084 }
#0085 }
#0086 msgCache。lpEntry = NULL;
#0087 return FALSE;
#0088 }
#0089 ASSERT(FALSE); // not reached
#0090
#0091 LDispatch:
#0092 union MessageMapFunctions mmf;
#0093 mmf。pfn = lpEntry…》pfn;
#0094
#0095 switch (lpEntry…》nSig)
#0096 {
#0097 case AfxSig_bD:
#0098 lResult = (this…》*mmf。pfn_bD)(CDC::FromHandle((HDC)wParam));
#0099 break;
#0100
#0101 case AfxSig_bb: // AfxSig_bb; AfxSig_bw; AfxSig_bh
#0102 lResult = (this…》*mmf。pfn_bb)((BOOL)wParam);
#0103 break;
#0104
569
…………………………………………………………Page 632……………………………………………………………
第篇 深入 MFC 程式設計
#0105 case AfxSig_bWww: // really AfxSig_bWiw
#0106 lResult = (this…》*mmf。pfn_bWww)(CWnd::FromHandle((HWND)wParam);
#0107 (short)LOWORD(lParam); HIWORD(lParam));
#0108 break;
#0109
#0110 case AfxSig_bHELPINFO:
#0111 lResult = (this…》*mmf。pfn_bHELPINFO)((HELPINFO*)lParam);
#0112 break;
#0113
#0114 case AfxSig_is:
#0115 lResult = (this…》*mmf。pfn_is)((LPTSTR)lParam);
#0116 break;
#0117
#0118 case AfxSig_lwl:
#0119 lResult = (this…》*mmf。pfn_lwl)(wParam; lParam);
#0120 break;
#0121
#0122 case AfxSig_vv:
#0123 (this…》*mmf。pfn_vv)();
#0124 break;
#0125 。。。
#0126 }
#0127 goto LReturnTrue;
#0128
#0129 LDispatchRegistered: // for registered windows messages
#0130 ASSERT(message 》= 0xC000);
#0131 mmf。pfn = lpEntry…》pfn;
#0132 lResult = (this…》*mmf。pfn_lwl)(wParam; lParam);
#0133
#0134 LReturnTrue:
#0135 if (pResult != NULL)
#0136 *pResult = lResult;
#0137 return TRUE;
#0138 }
#0001 AfxFindMessageEntry (const AFX_MSGMAP_ENTRY* lpEntry;
#0002 UINT nMsg; UINT nCode; UINT nID)
#0003 {
#0004 #if defined(_M_IX86) && !defined(_AFX_PORTABLE)
#0005 // 32…bit Intel 386/486 version。
#0006 。。。 //以汇编语言码处理,加快速度。
#0007 #else // _AFX_PORTABLE
#0008 // C version of search routine
#0009 while (lpEntry…》nSig !=