做电脑系统最好的网站,企业高端wordpress主题,计算机专业网页制作,个人域名备案的要求MFC文档
之前我们在写字符雨的时候#xff0c;将数据都存储到了视图类中#xff0c;这是不合理的#xff0c;视图类只负责显示#xff0c;不应该存储任何数据
文档#xff1a;专门存储数据用的
CDocument
文档与视图的关系#xff1a; 创建一个文档类
单文档四个类都…MFC文档
之前我们在写字符雨的时候将数据都存储到了视图类中这是不合理的视图类只负责显示不应该存储任何数据
文档专门存储数据用的
CDocument
文档与视图的关系 创建一个文档类
单文档四个类都集齐了
通过LoadFrame函数来创建
我们在应用程序类中InitInstance函数中删除掉原来的Create方法
class MyDoc:public CDocument{}CCreateContext pContext;
pContext.m_pNewViewClass RUNTIME_CLASS(MyView);
pContext.m_pCurrentDoc new myDoc;
pFrame.LoadFrame(IDR_MENU,WS_OVERLAPPEDWINDOW,NULL,pContext);这样写出来之后我们发现窗口也能够运行
LoadFrame{Create/注册修改回调函数地址
}视图类是什么时候创建的
视图和文档的关系绑定在什么时候 Create注册窗口埋了钩子修改了回调函数
WM_CREATE消息
出发钩子函数
去消息数组里遍历有没有WM_CREATE消息如果有的话处理
在WM_CREATE消息中创建了视图
视图.Create也会触发WM_CREATE消息我们在视图类中处理
如果视图类和文档类没有绑定会崩溃这里交给视图类处理WM_CREATE消息就省略了绑定的过程所以就没有绑定
CCreateContext pContext;
pContext.m_pNewViewClass RUNTIME_CLASS(MyView);//视图静态结构体类信息
pContext.m_pCurrentDoc new myDoc;//文档对象地址
//内部this指针框架
pFrame-LoadFrame(.....,pContext);
{Create(...pContext){CreateEx(......pContext){CREATESTRUCT cs;cs.lpCreateParams lpParam;CreateWindowEx(cs结构体成员)}}
}框架类WM_CREATE消息处理
CFrameWnd::OnCreate(cs);{//取出pContextCCreateContext* pContext (CCreateContext*)lpcs-lpCreateParams;//参数为pContextOnCreateHelper(lpcs, pContext);{OnCreateClient(lpcs, pContext){//第一个参数context结构体CreateView(pContext, AFX_IDW_PANE_FIRST){//动态创建视图CWnd* pView (CWnd*)pContext-m_pNewViewClass-CreateObject();pView-Create(.....pContext){//this指针视图对象CreateEx(.....pContext);{CREATESTRUCT cs;cs.lpCreateParams pContext;CreateWindowEx(cs结构体)//....又触发了WM_CREATE消息}}}}}}视图类又处理WM_CREATE消息
CEditView::OnCreate(cs);
{CCtrlView::OnCreate(lpcs) {//又取出了ContextCCreateContext* pContext (CCreateContext*)lpcs-lpCreateParams;pContext-m_pCurrentDoc-AddView(视图对象);//this{//this指针 是不是文档类this-m_viewList.AddTail(pView);//视图类对象成员 保存文档pView-m_pDocument this; }}
}一个文档可以绑定多个视图多个视图可以绑定同一个文档
afxGetApp(); MFC全局变量 --获取到应用程序类 theapp theapp 有个变量 存储着框架类对象 m_pMainWnd 有个变量 活动视图 拿到视图类对象
WM_COMMAND消息处理顺序的问题
文档和视图如何交互
文档类UpdateAllViews 通知所有视图文档已被修改的消息
视图类::OnUpdate----如果文档类数据发生改变 你怎么绘制 GetDocument 返回与视图相连接的文档 返回文档类对象MFC单文档架构
只有一个文档类
//单文档架构的模板类
CSingleDocTemplate* pDocTemplate;pDocTemplate new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMFCApplication8Doc), //文档类 类信息 RUNTIME_CLASS(CMainFrame), //框架类 类信息RUNTIME_CLASS(CMFCApplication8View)); //视图类类信息
{this-m_pOnlyDoc NULL;this-m_pDocClass pDocClass;this-m_pFrameClass pFrameClass;this-m_pViewClass pViewClass;
}//内部this指针应用程序类
//参数单文档模板类
this-AddDocTemplate(pDocTemplate);
{//微软未公开文档管理//应用程序类--有个成员是文档管理this-m_pDocManager new CDocManager;//内部this指针文档管理m_pDocManager-AddDocTemplate(pTemplate);{//文档管理类 链表成员保存了 单文档模板地址m_templateList.AddTail(pTemplate);}
}m_nShellCommand FileNew;ProcessShellCommand(cmdInfo)
{OnFileNew(){m_pDocManager-OnFileNew(){//多态 文档模板类 -----单文档模板类CDocTemplate* pTemplate (CDocTemplate*)m_templateList.GetHead();//内部this指针单文档模板类pTemplate-OpenDocumentFile(NULL){OpenDocumentFile(lpszPathName, TRUE, bMakeVisible);{CDocument* pDocument NULL;CFrameWnd* pFrame NULL;//动态创建文档类CDocument* pDocument (CDocument*)m_pDocClass-CreateObject();m_pOnlyDoc pDoc;}pFrame CreateNewFrame(pDocument, NULL);CCreateContext context;context.m_pCurrentFrame pOther;context.m_pCurrentDoc pDoc;//动态创建框架类对象CFrameWnd* pFrame (CFrameWnd*)m_pFrameClass-CreateObject();}}}
}