首先看定义
#define BEGIN_MESSAGE_MAP(theClass, baseClass) /
const AFX_MSGMAP* theClass::GetMessageMap() const /
{ return &theClass::messageMap; } /
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = /
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; /
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = /
{ /
实际应用BEGIN_MESSAGE_MAP(myview,CView)等价于
const AFX_MSGMAP* myview::GetMessageMap() const /
{ return & myview::messageMap; } /
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP myview::messageMap = /
{ & CView::messageMap, & myview::_messageEntries[0] }; /
AFX_COMDAT const AFX_MSGMAP_ENTRY myview::_messageEntries[] = /
{ /
还有END_MESSAGE_MAP和BEGIN_MESSAGE_MAP是成对出现的
#define END_MESSAGE_MAP() /
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } /
}; /
整个程序改成如下:
#include <afxwin.h>
#include <afxext.h>
#include "resource.h"
class mydoc:public CDocument
{
public:
static const CRuntimeClass classmydoc;
virtual CRuntimeClass* GetRuntimeClass() const;
static CObject* __stdcall CreateObject();
public :
CString s;
CPoint point;
mydoc()
{
s="Welcome to SDI";
point.x=250;
point.y=100;
}
};
CObject* __stdcall mydoc::CreateObject()
{ return new mydoc; }
const CRuntimeClass mydoc::classmydoc =
{
"mydoc", sizeof(class mydoc), 0xFFFF, mydoc::CreateObject,
(CRuntimeClass*)(& CDocument::classCDocument), NULL };
CRuntimeClass* mydoc::GetRuntimeClass() const
{ return ((CRuntimeClass*)(& mydoc::classmydoc)); }
class myview:public CView
{
public:
static const CRuntimeClass classmyview;
virtual CRuntimeClass* GetRuntimeClass() const;
static CObject* __stdcall CreateObject();
public:
void OnDraw(CDC *d)
{
mydoc *b;
b=(mydoc *)m_pDocument;
d->SetTextColor(RGB(0,0,0)) ;
d->TextOut(b->point.x,b->point.y ,b->s) ;
}
void OnLButtonDown(UINT nFlags,CPoint p)
{
mydoc *b;
b=(mydoc*)m_pDocument;
b->point.x=p.x;
b->point.y=p.y;
Invalidate();
}
private:
static const AFX_MSGMAP_ENTRY _messageEntries[];
protected:
static AFX_DATA const AFX_MSGMAP messageMap;
virtual const AFX_MSGMAP* GetMessageMap() const;
};
CObject* __stdcall myview::CreateObject()
{ return new myview; }
const CRuntimeClass myview::classmyview =
{
"myview", sizeof(class myview), 0xFFFF, myview::CreateObject,
(CRuntimeClass*)(& CView::classCView), NULL
};
CRuntimeClass* myview::GetRuntimeClass() const
{
return ((CRuntimeClass*)(& myview::classmyview));
}
const AFX_MSGMAP* myview::GetMessageMap() const
{ return & myview::messageMap; }
const AFX_MSGMAP myview::messageMap =
{ & CView::messageMap, & myview::_messageEntries[0] };
const AFX_MSGMAP_ENTRY myview::_messageEntries[] =
{
{
WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp,
(AFX_PMSG)(AFX_PMSGW)(void (CWnd::*)(UINT, CPoint))&OnLButtonDown
},
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
};
class zzz:public CWinApp
{
public:
int InitInstance()
{
CSingleDocTemplate *y;
CRuntimeClass *w,*d,*v;
d=(CRuntimeClass*)(&mydoc::classmydoc);
w=(CRuntimeClass*)(&CFrameWnd::classCFrameWnd);
v=(CRuntimeClass*)(&myview::classmyview);
y=new CSingleDocTemplate(IDR_MENU1,d,w,v);
AddDocTemplate(y);
OnFileNew();
return 1;
}
};
zzz a;
(全文完)