一、作用
文档就是提供用于管理数据模块
文档类CDocument,父类CCmdTarget,封装了文档类和视图类关系
二、实例
1、创建桌面应用程序,导入头文件
2、添加类
class CMyDoc :public CDocument { }; //派生CEditView不用重写Ondraw class CMyView :public CEditView { DECLARE_DYNCREATE(CMyView) }; IMPLEMENT_DYNCREATE(CMyView, CEditView) class CMyFrameWnd :public CFrameWnd { }; class CMyWinApp :public CWinApp { public: virtual BOOL InitInstance(); }; CMyWinApp theApp;
3、重写InitInstance函数
BOOL CMyWinApp::InitInstance() { CMyFrameWnd* pFrame = new CMyFrameWnd; //文档类的对象地址 CCreateContext cct; //视图类的静态变量 cct.m_pCurrentDoc = new CMyDoc; cct.m_pNewViewClass = RUNTIME_CLASS(CMyView); //loadframe自动重写了Oncreate函数 pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&cct); m_pMainWnd = pFrame; pFrame->ShowWindow(SW_SHOW); pFrame->UpdateData(); return TRUE; }
4、运行结果
5、证明父类窗口帮我们处理了OnCreate函数:通过框架重写Oncreate函数,返回0,编辑窗口将不会出现
class CMyFrameWnd :public CFrameWnd { DECLARE_MESSAGE_MAP() public: afx_msg int OnCreate(LPCREATESTRUCT pcs); }; BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd) ON_WM_CREATE() END_MESSAGE_MAP() int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) { return CFrameWnd::OnCreate(pcs); //return 0; }
6、证明视图类窗口帮我们绑定了视图类和文档类对象,在视图类创建消息机制
class CMyView :public CEditView { DECLARE_MESSAGE_MAP() DECLARE_DYNCREATE(CMyView) public: afx_msg int OnCreate(LPCREATESTRUCT pcs); }; BEGIN_MESSAGE_MAP(CMyView,CEditView) ON_WM_CREATE() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(CMyView, CEditView) int CMyView::OnCreate(LPCREATESTRUCT pcs) { //必须调用父类,否则报错 return CEditView::OnCreate(pcs); //return 0; }
三、命令消息(WM_COMMAND)的处理顺序,都写上函数,看看那个先弹出
View-->Document-->Frame-->App class CMyDoc :public CDocument { DECLARE_MESSAGE_MAP() public: afx_msg void xinjian(); }; BEGIN_MESSAGE_MAP(CMyDoc, CDocument) ON_COMMAND(ID_XJ,xinjian) END_MESSAGE_MAP() void CMyDoc::xinjian() { AfxMessageBox("文档处理消息了"); }
四、自己定义一个类,先执行消息处理函数
1、声明自己的类,并添加消息处理机制
class CGyb :public CCmdTarget { DECLARE_MESSAGE_MAP() public: afx_msg void xinjian(); }; BEGIN_MESSAGE_MAP(CGyb,CCmdTarget) ON_COMMAND(ID_XJ,xinjian) END_MESSAGE_MAP() void CGyb::xinjian() { AfxMessageBox("我自己处理了函数"); }
2、在框架类声明OnCmdMsg函数
virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
3、实现OnCmdMsg函数
BOOL CMyFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { CGyb gyb; if (gyb.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) { return TRUE; //如果找到执行自己的函数 } //如果没找到,执行父类函数,按原来顺序执行 return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); }