MFC文档
之前我们在写字符雨的时候,将数据都存储到了视图类中,这是不合理的,视图类只负责显示,不应该存储任何数据
文档:专门存储数据用的
CDocument
文档与视图的关系:
创建一个文档类
单文档四个类都集齐了
通过LoadFrame函数来创建
我们在应用程序类中InitInstance函数中,删除掉原来的Create方法:
cpp
class MyDoc:public CDocument{
}
cpp
CCreateContext pContext;
pContext.m_pNewViewClass = RUNTIME_CLASS(MyView);
pContext.m_pCurrentDoc = new myDoc;
pFrame.LoadFrame(IDR_MENU,WS_OVERLAPPEDWINDOW,NULL,&pContext);
这样写出来之后,我们发现窗口也能够运行
cpp
LoadFrame{
Create/注册,修改回调函数地址
}
视图类是什么时候创建的?
视图和文档的关系绑定在什么时候?
Create注册窗口,埋了钩子,修改了回调函数
WM_CREATE消息
出发钩子函数
去消息数组里遍历有没有WM_CREATE消息,如果有的话,处理
在WM_CREATE消息中,创建了视图
视图.Create也会触发WM_CREATE消息,我们在视图类中处理:
如果视图类和文档类没有绑定,会崩溃(这里交给视图类处理WM_CREATE消息)就省略了绑定的过程,所以就没有绑定
cpp
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消息处理:
cpp
CFrameWnd::OnCreate(cs);
{
//取出pContext
CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
//参数为pContext
OnCreateHelper(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消息:
cpp
CEditView::OnCreate(cs);
{
CCtrlView::OnCreate(lpcs)
{
//又取出了Context
CCreateContext* 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单文档架构:
只有一个文档类
cpp
//单文档架构的模板类
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();
}
}
}
}