enum  AfxSig
{
        AfxSig_end 
=   0 ,      //  [marks end of message map]
        AfxSig_vv,
}
;

#define  ON_COMMAND(id, memberFxn) \
   
{ WM_COMMAND,  0 , (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memberFxn } ,

  1 #define  TRUE 1
  2 #define  FALSE 0
  3
  4 typedef  char *  LPSTR;
  5 typedef  const   char *  LPCSTR;
  6
  7 typedef unsigned  long   DWORD;
  8 typedef  int             BOOL;
  9 typedef unsigned  char   BYTE;
 10 typedef unsigned  short  WORD;
 11 typedef  int             INT;
 12 typedef unsigned  int    UINT;
 13 typedef  long            LONG;
 14
 15 typedef UINT           WPARAM;
 16 typedef LONG           LPARAM;
 17 typedef LONG           LRESULT;
 18 typedef  int             HWND;
 19
 20 #define  WM_COMMAND     0x0111   //  following windows.h
 21 #define  WM_CREATE      0x0001
 22 #define  WM_PAINT       0x000F
 23 #define  WM_NOTIFY      0x004E
 24
 25 #define  CObjectid              0xffff
 26 #define    CCmdTargetid         1
 27 #define      CWinThreadid       11
 28 #define        CWinAppid        111
 29 #define          CMyWinAppid    1111
 30 #define      CWndid             12
 31 #define        CFrameWndid      121
 32 #define          CMyFrameWndid  1211
 33 #define        CViewid          122
 34 #define          CMyViewid      1221
 35 #define      CDocumentid        13
 36 #define        CMyDocid         131
 37
 38 #include  < iostream.h >
 39
 40 ////////////////////////////////////////////////////////////////// //
 41 //  Window message map handling
 42
 43 struct  AFX_MSGMAP_ENTRY;
 44
 45 struct  AFX_MSGMAP
 46 {
 47         AFX_MSGMAP *  pBaseMessageMap;
 48         AFX_MSGMAP_ENTRY *  lpEntries;
 49 }
;
 50
 51 #define  DECLARE_MESSAGE_MAP() \
 52          static  AFX_MSGMAP_ENTRY _messageEntries[]; \
 53          static  AFX_MSGMAP messageMap; \
 54          virtual  AFX_MSGMAP *  GetMessageMap()  const ;
 55
 56 #define  BEGIN_MESSAGE_MAP(theClass, baseClass) \
 57         AFX_MSGMAP *  theClass::GetMessageMap()  const  \
 58                  return   & theClass::messageMap; }  \
 59         AFX_MSGMAP theClass::messageMap  =  \
 60          & (baseClass::messageMap), \
 61                 (AFX_MSGMAP_ENTRY * & (theClass::_messageEntries) }
; \
 62         AFX_MSGMAP_ENTRY theClass::_messageEntries[]  =  \
 63          {
 64
 65 #define  END_MESSAGE_MAP() \
 66          0 0 0 0 , AfxSig_end, (AFX_PMSG) 0  }  \
 67         }
;
 68
 69 //  Message map signature values and macros in separate header
 70 #include  " afxmsg_.h "
 71
 72 class  CObject
 73 {
 74 public :
 75   CObject::CObject()   {
 76                       }

 77   CObject:: ~ CObject()  {
 78                       }

 79 }
;
 80
 81 class  CCmdTarget :  public  CObject
 82 {
 83 public :
 84   CCmdTarget::CCmdTarget()   {
 85                             }

 86   CCmdTarget:: ~ CCmdTarget()  {
 87                             }

 88
 89    virtual  BOOL OnCmdMsg(UINT nID,  int  nCode);
 90
 91   DECLARE_MESSAGE_MAP()        //  base class - no {{ }} macros
 92 }
;
 93
 94 typedef  void  (CCmdTarget:: * AFX_PMSG)( void );
 95
 96 struct  AFX_MSGMAP_ENTRY   //  MFC 4.0 format
 97 {
 98     UINT nMessage;  //  windows message
 99     UINT nCode;     //  control code or WM_NOTIFY code
100     UINT nID;       //  control ID (or 0 for windows messages)
101     UINT nLastID;   //  used for entries specifying a range of control id's
102     UINT nSig;      //  signature type (action) or pointer to message #
103     AFX_PMSG pfn;   //  routine to call (or special value)
104 }
;
105
106 class  CWinThread :  public  CCmdTarget
107 {
108 public :
109   CWinThread::CWinThread()   {
110                             }

111   CWinThread:: ~ CWinThread()  {
112                             }

113
114    virtual  BOOL InitInstance()  {
115                                 cout  <<   " CWinThread::InitInstance \n " ;
116                                  return  TRUE;
117                               }

118    virtual   int  Run()  {
119                       cout  <<   " CWinThread::Run \n " ;
120                        //  AfxWndProc();
121                        return   1 ;
122                     }

123 }
;
124
125 class  CWnd;
126
127 class  CWinApp :  public  CWinThread
128 {
129 public :
130   CWinApp *  m_pCurrentWinApp;
131   CWnd *  m_pMainWnd;
132
133 public :
134   CWinApp::CWinApp()   {
135                         m_pCurrentWinApp  =   this ;
136                       }

137   CWinApp:: ~ CWinApp()  {
138                       }

139
140    virtual  BOOL InitApplication()  {
141                                    cout  <<   " CWinApp::InitApplication \n " ;
142                                     return  TRUE;
143                                  }

144    virtual  BOOL InitInstance()     {
145                                    cout  <<   " CWinApp::InitInstance \n " ;
146                                     return  TRUE;
147                                  }

148    virtual   int  Run()  {
149                       cout  <<   " CWinApp::Run \n " ;
150                        return  CWinThread::Run();
151                     }

152
153   DECLARE_MESSAGE_MAP()
154 }
;
155
156 typedef  void  (CWnd:: * AFX_PMSGW)( void );
157                  //  like 'AFX_PMSG' but for CWnd derived classes only
158
159 class  CDocument :  public  CCmdTarget
160 {
161 public :
162   CDocument::CDocument()    {
163                            }

164   CDocument:: ~ CDocument()   {
165                            }

166
167    virtual  BOOL OnCmdMsg(UINT nID,  int  nCode);
168
169   DECLARE_MESSAGE_MAP()
170 }
;
171
172 class  CWnd :  public  CCmdTarget
173 {
174 public :
175   CWnd::CWnd()    {
176                  }

177   CWnd:: ~ CWnd()   {
178                  }

179
180    virtual  BOOL Create();
181   BOOL CreateEx();
182    virtual  BOOL PreCreateWindow();
183    virtual  LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
184    virtual  LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
185    virtual  BOOL OnCommand(WPARAM wParam, LPARAM lParam);
186
187   DECLARE_MESSAGE_MAP()
188 }
;
189
190 class  CView;
191
192 class  CFrameWnd :  public  CWnd
193 {
194 public :
195   CView *  m_pViewActive;        //  current active view
196
197 public :
198   CFrameWnd::CFrameWnd()    {
199                            }

200   CFrameWnd:: ~ CFrameWnd()   {
201                            }

202   BOOL Create();
203    virtual  BOOL PreCreateWindow();
204   CView *  GetActiveView()  const ;
205    virtual  BOOL OnCommand(WPARAM wParam, LPARAM lParam);
206    virtual  BOOL OnCmdMsg(UINT nID,  int  nCode);
207
208   DECLARE_MESSAGE_MAP()
209
210   friend CView;
211 }
;
212
213 class  CView :  public  CWnd
214 {
215 public :
216   CDocument *  m_pDocument;
217
218 public :
219   CView::CView()    {
220                    }

221   CView:: ~ CView()   {
222                    }

223
224    virtual  BOOL OnCmdMsg(UINT nID,  int  nCode);
225
226   DECLARE_MESSAGE_MAP()
227
228   friend CFrameWnd;
229 }
;
230
231 //  global function
232 CWinApp *  AfxGetApp();
233 LRESULT AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam,
234                    CWnd *  pWnd);  //  last param. pWnd is added by JJHOU.
235 LRESULT AfxCallWndProc(CWnd *  pWnd, HWND hWnd, UINT nMsg, WPARAM wParam,
236                        LPARAM lParam);
237

 1 #include  < iostream.h >
 2 #include  " mfc.h "
 3
 4 class  CMyWinApp :  public  CWinApp
 5 {
 6 public :
 7   CMyWinApp::CMyWinApp()    {
 8                            }

 9   CMyWinApp:: ~ CMyWinApp()   {
10                            }

11    virtual  BOOL InitInstance();
12   DECLARE_MESSAGE_MAP()
13 }
;
14
15 class  CMyFrameWnd :  public  CFrameWnd
16 {
17 public :
18   CMyFrameWnd();
19    ~ CMyFrameWnd()   {
20                   }

21   DECLARE_MESSAGE_MAP()
22 }
;
23
24 class  CMyDoc :  public  CDocument
25 {
26 public :
27   CMyDoc::CMyDoc()   {
28                     }

29   CMyDoc:: ~ CMyDoc()  {
30                     }

31   DECLARE_MESSAGE_MAP()
32 }
;
33
34 class  CMyView :  public  CView
35 {
36 public :
37   CMyView::CMyView()    {
38                        }

39   CMyView:: ~ CMyView()   {
40                        }

41   DECLARE_MESSAGE_MAP()
42 }
;
43

  1 #include  " my.h "    //  赣 mfc.h 碞 extern CMyWinApp ┮
  2
  3 extern  CMyWinApp theApp;
  4 extern   void  printlpEntries(AFX_MSGMAP_ENTRY *  lpEntry);
  5
  6 BOOL CCmdTarget::OnCmdMsg(UINT nID,  int  nCode)
  7 {
  8     cout  <<   " CCmdTarget::OnCmdMsg() "   <<  endl;
  9      //  Now look through message map to see if it applies to us
 10     AFX_MSGMAP *  pMessageMap;
 11     AFX_MSGMAP_ENTRY *  lpEntry;
 12      for  (pMessageMap  =  GetMessageMap(); pMessageMap  !=  NULL;
 13          pMessageMap  =  pMessageMap -> pBaseMessageMap)
 14      {
 15             lpEntry  =  pMessageMap -> lpEntries;
 16             printlpEntries(lpEntry);
 17     }

 18
 19      return  FALSE;    //  not handled
 20 }

 21
 22 BOOL CWnd::Create()
 23 {
 24     cout  <<   " CWnd::Create \n " ;
 25      return  TRUE;
 26 }

 27
 28 BOOL CWnd::CreateEx()
 29 {
 30     cout  <<   " CWnd::CreateEx \n " ;
 31     PreCreateWindow();
 32      return  TRUE;
 33 }

 34
 35 BOOL CWnd::PreCreateWindow()
 36 {
 37   cout  <<   " CWnd::PreCreateWindow \n " ;
 38    return  TRUE;
 39 }

 40
 41 LRESULT CWnd::WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
 42 {
 43     AFX_MSGMAP *  pMessageMap;
 44     AFX_MSGMAP_ENTRY *  lpEntry;
 45
 46     cout  <<   " CWnd::WindowProc() "   <<  endl;
 47      if  (nMsg  ==  WM_COMMAND)  //  special case for commands
 48      {
 49          if  (OnCommand(wParam, lParam))
 50              return   1L //  command handled
 51          else
 52              return  (LRESULT)DefWindowProc(nMsg, wParam, lParam);
 53     }

 54
 55     pMessageMap  =  GetMessageMap();
 56
 57      for  (; pMessageMap  !=  NULL;
 58          pMessageMap  =  pMessageMap -> pBaseMessageMap)
 59      {
 60             lpEntry  =  pMessageMap -> lpEntries;
 61             printlpEntries(lpEntry);
 62     }

 63      return   0 ;   //  J.J.Hou: if find, should call lpEntry->pfn,
 64                 //  otherwise should call DefWindowProc.
 65                 //  for simplization we just return 0.
 66 }

 67
 68 LRESULT CWnd::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
 69 {
 70     cout  <<   " CWnd::DefWindowProc() "   <<  endl;
 71      return  TRUE;
 72 }

 73
 74 BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam)
 75 {
 76     cout  <<   " CWnd::OnCommand() "   <<  endl;
 77      //  
 78      return  OnCmdMsg( 0 0 );
 79 }

 80
 81 BOOL CFrameWnd::OnCommand(WPARAM wParam, LPARAM lParam)
 82 {
 83     cout  <<   " CFrameWnd::OnCommand() "   <<  endl;
 84      //  
 85      //  route as normal command
 86      return  CWnd::OnCommand(wParam, lParam);
 87 }

 88
 89 BOOL CFrameWnd::Create()
 90 {
 91     cout  <<   " CFrameWnd::Create \n " ;
 92     CreateEx();
 93      return  TRUE;
 94 }

 95
 96 BOOL CFrameWnd::PreCreateWindow()
 97 {
 98     cout  <<   " CFrameWnd::PreCreateWindow \n " ;
 99      return  TRUE;
100 }

101
102 CView *  CFrameWnd::GetActiveView()  const
103 {
104     cout  <<   " CFrameWnd::GetActiveView() "   <<  endl;
105      return  m_pViewActive;
106 }

107
108 BOOL CFrameWnd::OnCmdMsg(UINT nID,  int  nCode)
109 {
110     cout  <<   " CFrameWnd::OnCmdMsg() "   <<  endl;
111      //  pump through current view FIRST
112     CView *  pView  =  GetActiveView();
113      if  (pView -> OnCmdMsg(nID, nCode))
114              return  TRUE;
115
116      //  then pump through frame
117      if  (CWnd::OnCmdMsg(nID, nCode))
118              return  TRUE;
119
120      //  last but not least, pump through app
121     CWinApp *  pApp  =  AfxGetApp();
122      if  (pApp -> OnCmdMsg(nID, nCode))
123              return  TRUE;
124
125      return  FALSE;
126 }

127
128 BOOL CDocument::OnCmdMsg(UINT nID,  int  nCode)
129 {
130     cout  <<   " CDocument::OnCmdMsg() "   <<  endl;
131      if  (CCmdTarget::OnCmdMsg(nID, nCode))
132          return  TRUE;
133
134      return  FALSE;
135 }

136
137 BOOL CView::OnCmdMsg(UINT nID,  int  nCode)
138 {
139     cout  <<   " CView::OnCmdMsg() "   <<  endl;
140      if  (CWnd::OnCmdMsg(nID, nCode))
141          return  TRUE;
142
143     BOOL bHandled  =  FALSE;
144     bHandled  =  m_pDocument -> OnCmdMsg(nID, nCode);
145      return  bHandled;
146 }

147
148 AFX_MSGMAP *  CCmdTarget::GetMessageMap()  const    //  JJHou: in MFC 40 cmdtarg.cpp
149 {
150      return   & CCmdTarget::messageMap;
151 }

152
153 AFX_MSGMAP CCmdTarget::messageMap  =     //  JJHou: in in MFC 40 cmdtarg.cpp
154 {
155     NULL,
156      & CCmdTarget::_messageEntries[ 0 ]
157 }
;
158
159 AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries[]  =   //  JJHou: in in MFC 40 cmdtarg.cpp
160 {
161      0 0 , CCmdTargetid,  0 , AfxSig_end,  0  }    //  nothing here
162 }
;
163
164 BEGIN_MESSAGE_MAP(CWnd, CCmdTarget)
165 ON_COMMAND(CWndid,  0 )
166 END_MESSAGE_MAP()
167
168 BEGIN_MESSAGE_MAP(CFrameWnd, CWnd)
169 ON_COMMAND(CFrameWndid,  0 )
170 END_MESSAGE_MAP()
171
172 BEGIN_MESSAGE_MAP(CDocument, CCmdTarget)
173 ON_COMMAND(CDocumentid,  0 )
174 END_MESSAGE_MAP()
175
176 BEGIN_MESSAGE_MAP(CView, CWnd)
177 ON_COMMAND(CViewid,  0 )
178 END_MESSAGE_MAP()
179
180 BEGIN_MESSAGE_MAP(CWinApp, CCmdTarget)
181 ON_COMMAND(CWinAppid,  0 )
182 END_MESSAGE_MAP()
183
184 CWinApp *  AfxGetApp()
185 {
186    return  theApp.m_pCurrentWinApp;
187 }

188
189 LRESULT AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam,
190                    CWnd  * pWnd)   //  last param. pWnd is added by JJHou.
191 {
192   cout  <<   " AfxWndProc() "   <<  endl;
193    return  AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
194 }

195
196 LRESULT AfxCallWndProc(CWnd *  pWnd, HWND hWnd, UINT nMsg,
197                        WPARAM wParam, LPARAM lParam)
198 {
199   cout  <<   " AfxCallWndProc() "   <<  endl;
200   LRESULT lResult  =  pWnd -> WindowProc(nMsg, wParam, lParam);
201    return  lResult;
202 }

203

 1 #include  " my.h "
 2
 3 CMyWinApp theApp;   //  global object
 4
 5 BOOL CMyWinApp::InitInstance()
 6 {
 7     cout  <<   " CMyWinApp::InitInstance \n " ;
 8     m_pMainWnd  =   new  CMyFrameWnd;
 9      return  TRUE;
10 }

11
12 CMyFrameWnd::CMyFrameWnd()
13 {
14     Create();
15 }

16
17 BEGIN_MESSAGE_MAP(CMyWinApp, CWinApp)
18 ON_COMMAND(CMyWinAppid,  0 )
19 END_MESSAGE_MAP()
20
21 BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
22 ON_COMMAND(CMyFrameWndid,  0 )
23 END_MESSAGE_MAP()
24
25 BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
26 ON_COMMAND(CMyDocid,  0 )
27 END_MESSAGE_MAP()
28
29 BEGIN_MESSAGE_MAP(CMyView, CView)
30 ON_COMMAND(CMyViewid,  0 )
31 END_MESSAGE_MAP()
32
33 void   printlpEntries(AFX_MSGMAP_ENTRY *  lpEntry)
34 {
35 struct   {
36    int  classid;
37    char *  classname;
38 }
 classinfo[]  =   {
39                     CCmdTargetid ,   " CCmdTarget    " ,
40                     CWinThreadid ,   " CWinThread    " ,
41                     CWinAppid    ,   " CWinApp       " ,
42                     CMyWinAppid  ,   " CMyWinApp     " ,
43                     CWndid       ,   " CWnd          " ,
44                     CFrameWndid  ,   " CFrameWnd     " ,
45                     CMyFrameWndid,   " CMyFrameWnd   " ,
46                     CViewid      ,   " CView         " ,
47                     CMyViewid    ,   " CMyView       " ,
48                     CDocumentid  ,   " CDocument     " ,
49                     CMyDocid     ,   " CMyDoc        " ,
50                      0             ,   "               "
51                 }
;
52
53      for  ( int  i = 0 ; classinfo[i].classid  !=   0 ; i ++ )
54      {
55          if  (classinfo[i].classid  ==  lpEntry -> nID)
56          {
57             cout  <<  lpEntry -> nID  <<   "      " ;
58             cout  <<  classinfo[i].classname  <<  endl;
59              break ;
60         }

61     }

62 }

63 // ------------------------------------------------------------------
64 //  main
65 // ------------------------------------------------------------------
66 void  main()
67 {
68     CWinApp *  pApp  =  AfxGetApp();
69
70     pApp -> InitApplication();
71     pApp -> InitInstance();
72     pApp -> Run();
73
74     CMyDoc *  pMyDoc  =   new  CMyDoc;
75     CMyView *  pMyView  =   new  CMyView;
76     CFrameWnd *  pMyFrame  =  (CFrameWnd * )pApp -> m_pMainWnd;
77     pMyFrame -> m_pViewActive  =  pMyView;
78     pMyView -> m_pDocument  =  pMyDoc;
79
80      //  test Message Routing
81     cout  <<  endl  <<   " pMyFrame receive WM_CREATE,  " ;
82     cout  <<   " routing path and call stack: "   <<  endl;
83     AfxWndProc( 0 , WM_CREATE,  0 0 , pMyFrame);
84
85     cout  <<  endl  <<   " pMyView receive WM_PAINT,  " ;
86     cout  <<   " routing path and call stack: "   <<  endl;
87     AfxWndProc( 0 , WM_PAINT,  0 0 , pMyView);
88
89     cout  <<  endl  <<   " pMyView receive WM_COMMAND,  " ;
90     cout  <<   " routing path and call stack: "   <<  endl;
91     AfxWndProc( 0 , WM_COMMAND,  0 0 , pMyView);
92
93     cout  <<  endl  <<   " pMyFrame receive WM_COMMAND,  " ;
94     cout  <<   " routing path and call stack: "   <<  endl;
95     AfxWndProc( 0 , WM_COMMAND,  0 0 , pMyFrame);
96 }

97