MFC 学习笔记( 八 )

六.MFC架构程序单文档视图架构:单文档视图架构特点:
只能管理一个文档(只有一个文档类对象)
单文档视图架构使用:

MFC 学习笔记

文章插图
实现:
#include <afxwin.h>#include "resource.h"class CMyDoc : public CDocument{ DECLARE_DYNCREATE( CMyDoc )};IMPLEMENT_DYNCREATE( CMyDoc, CDocument )class CMyView : public CView{ DECLARE_DYNCREATE( CMyView )public: virtual void OnDraw( CDC* pDC );};IMPLEMENT_DYNCREATE( CMyView, CView )void CMyView::OnDraw( CDC* pDC ){ pDC->TextOut( 100, 100, "我是视图窗口" );}class CMyFrameWnd : public CFrameWnd{ DECLARE_DYNCREATE( CMyFrameWnd )};IMPLEMENT_DYNCREATE( CMyFrameWnd, CFrameWnd )class CMyWinApp : public CWinApp{public: virtual BOOL InitInstance( );};BOOL CMyWinApp::InitInstance( ){ CSingleDocTemplate* pTemplate = new CSingleDocTemplate( IDR_MENU1,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMyFrameWnd),RUNTIME_CLASS(CMyView) ); AddDocTemplate( pTemplate ); OnFileNew( ); m_pMainWnd->ShowWindow( SW_SHOW ); m_pMainWnd->UpdateWindow( ); return TRUE;}CMyWinApp theApp;执行过程:
MFC 学习笔记

文章插图

MFC 学习笔记

文章插图
伪代码:
OnFileNew( )//函数内部this为&theApp{m_pDocManager->OnFileNew()//函数内部this为文档管理类对象地址{CDocTemplate* pTemplate = m_templateList.GetHead();//取出单文档模板类对象地址pTemplate->OpenDocumentFile()//函数内部this为单文档模板类对象地址{OpenDocumentFile(..)//函数内部this为单文档模板类对象地址{pDocument = CreateNewDocument()//函数内部this为单文档模板类对象地址{CDocument* pDocument = m_pDocClass->CreateObject();//动态创建文档类对象,并返回对象地址AddDocument(pDocument)//函数内部this为单文档模板类对象地址{m_pOnlyDoc = pDocument;}}pFrame = CreateNewFrame(pDocument..)//函数内部this为单文档模板类对象地址{CCreateContext context;...context.m_pCurrentDoc = pDocument;//文档类对象地址context.m_pNewViewClass = m_pViewClass;//RUNTIME_CLASS(CMyView)CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();//动态创建框架类对象,并返回对象地址pFrame->LoadFrame(...., &context);//创建框架窗口//后续过程看前一天的伪代码}}}}}关于类向导的使用:
类向导可以帮助我们在已有的框架创建基础上再进一步帮我们生成代码 。
选择: 位置 ->类向导
MFC 学习笔记

文章插图
再这个里面可以选择要添加的项目,添加到的文件,添加的内容,框架会帮我们生成规范化的内容,我们只需要实现具体细节 。
多文档视图架构:特点:
可以管理多个文档 (可以有多个文档类对象)
多文档视图架构使用:
MFC 学习笔记

文章插图
执行过程:
MFC 学习笔记

文章插图

MFC 学习笔记

文章插图
代码:
#include <afxwin.h>#include "resource.h"class CMyDoc : public CDocument{ DECLARE_DYNCREATE( CMyDoc )};IMPLEMENT_DYNCREATE( CMyDoc, CDocument )class CMyView : public CView{ DECLARE_DYNCREATE( CMyView )public: virtual void OnDraw( CDC* pDC );};IMPLEMENT_DYNCREATE( CMyView, CView )void CMyView::OnDraw( CDC* pDC ){ pDC->TextOut( 100, 100, "我是视图窗口" );}class CMyChild : public CMDIChildWnd{ DECLARE_DYNCREATE( CMyChild )};IMPLEMENT_DYNCREATE( CMyChild, CMDIChildWnd )class CMyFrameWnd : public CMDIFrameWnd{ //自己造主框架窗口类的对象};class CMyWinApp : public CWinApp{//自己造应用程序类的对象public: virtual BOOL InitInstance( );};BOOL CMyWinApp::InitInstance( ){ CMyFrameWnd* pFrame = new CMyFrameWnd; pFrame->LoadFrame( IDR_MENU1 ); m_pMainWnd = pFrame; pFrame->ShowWindow( SW_SHOW ); pFrame->UpdateWindow( ); CMultiDocTemplate* pTemplate = new CMultiDocTemplate( IDR_MENU2,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMyChild),RUNTIME_CLASS(CMyView)); AddDocTemplate( pTemplate ); OnFileNew( );//创建文档类对象,创建子框架类对象,创建子框架窗口,创建视图类对象,创建视图窗口,文档类对象和视图类对象关联 OnFileNew( );//创建文档类对象,创建子框架类对象,创建子框架窗口,创建视图类对象,创建视图窗口,文档类对象和视图类对象关联 OnFileNew( );//创建文档类对象,创建子框架类对象,创建子框架窗口,创建视图类对象,创建视图窗口,文档类对象和视图类对象关联 return TRUE;}CMyWinApp theApp;

经验总结扩展阅读