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
|
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|
导航
统计
- 随笔: 115
- 文章: 1
- 评论: 86
- 引用: 0
常用链接
留言簿(5)
随笔档案(115)
网址
搜索
积分与排名
最新评论
阅读排行榜
评论排行榜
|
|