一文档类
1,MFC文档相关类
用于管理数据,封装了数据和视图窗口之间的操作。CDocument --父类CCmdTarget
2,使用
1,利用CFrameWnd::LoadFrame函数创建框架窗口
2,在框架窗口的WM_CREATE消息中创建视图窗口
3,将视图窗口的WM_REATE消息中将视图类对象和文档类对象进行关系(建立绑定关系)
3.对象关系图
theApp
|-->m_pMainWnd
|-->m_pViewActive
|-->m_pDocument
|-->m_viewList(视图类对象链表)
4.命令消息处理顺序
默认 View-->Document-->FrameWnd-->WinApp
注意顺序可任意更改,也可以添加自己的消息处理类(继承自CCmdTarget)
二 单文档视图构架
1.相关类
CWinApp/CFrameWnd/CView/CDocument - 文档类
CDocTemplate - 文档模板类 (抽象类)
CSingleDocTemplate --单文档模板类
CMultiDocTemplate --多文档模板类
CDocManager --文档管理类
2.使用
关系
theApp
|->m_pDocManager(保存了文档管理类对象地址)
|->m_templateList(文档管理类的链表成员)
|------>|->CSingleDocTemplate
^
|
CSingleDocTemplate
|->m_pDocClass (保存了&CMyDoc::classCMyDoc)
|->m_pFrameClass (保存了&CMyFrameWnd::classCMyFrameWnd)
|->m_pViewClass (保存了&CMyView::classCMyView)
|->m_pOnlyDoc (保存了文档类对象地址)
OnFileNew执行过程
1,通过theApp获取文档管理类对象地址m_pDocManager
2,通过m_pDocManager获取保存在m_templateList链表中的单文档模板类对象地址
3,利用保存在单文档模板类对象中的m_pDocClass来创建文档类对象
3,利用保存在单文档类模板类对象中的m_pFrameClass来动态创建框架类对象。
3,利用框架类对象调用LoadFrame函数创建框架类窗口
4,利用框架窗口的WM_CREATE消息处理动态创建视图类对象并创建视图窗口
5,在视图类窗口WM_CREATE消息处理中将视图类对象和文档类对象进行关联
CWinApp::PreTranslateMessage 处理加速键需重写这个函数
除应用程序类自己定义,其他类都有MFC动态创建
伪代码:
CMyFrameWnd *pFrame=new CMyFrameWnd();
CCreateContext cct;
cct.m_pCurrentDoc=new CMyDocument();
cct.m_pNewViewClass=RUNTIME_CLASS(CMyView);
pFrame->LoadFrame(...,&cct);{ //函数内部this指针为pFrame
Create(...,&cct){ //this=pFrame
CreateEx(...,&cct){
CREATESTRUCT cs;
cs.lpCreateParams=&cct;
.....
::CreateWindow(...,&cct);
//窗口创建 触发框架窗口的WM_CREATE lParam获取cct
}
}
}
伪代码:
OnFileNew(){ //this=theApp;
m_pDocManager->OnFileNew();{
//this=m_pDocManager文档管理类对象
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
//重新获取存放在单文档模板类对象pTemplate的地址
pTemplate->OpenDocumentFile(NULL);{
//this=pTemplate this指针为自己new的单文档类地址
pDocument = CreateNewDocument();{
//this=pTemplate 单文档模板类对象地址
CDocument* pDocument =
(CDocument*)m_pDocClass->CreateObject();
//动态创建文档类对象地址
pFrame = CreateNewFrame(pDocument, NULL);{
//动态创建框架类对象 this=pTemplate
CCreateContext context; //cct
context.m_pCurrentFrame = pOther;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = m_pViewClass;
context.m_pNewDocTemplate = this;
CFrameWnd* pFrame =
(CFrameWnd*)m_pFrameClass->CreateObject();
//动态创建框架类对象 pFrame
pFrame->LoadFrame(m_nIDResource,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // default frame styles
NULL, &context)//context-->cct 实现文档 视图类对象的关联
}
}
}
}
}
*****************************************************************
视图窗口WM_CREATE
CEditView::OnCreate(lpCreateStruct){
//函数内部this指针为pView(动态创建的视图类对象)
//参数为CreateWindowEx函数的12个参数 最后一个cct
CCtrlView::OnCreate(lpCreateStruct){
CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
//获取&cct
pContext->m_pCurrentDoc->AddView(this);{ //this==pView
//函数内部this指针为文档类指针.参数为pView
m_viewList.AddTail(pView);
//将视图类对象地址保存在文档类的一个链表成员中
pView->m_pDocument = this;
//将文档类对子昂地址保存在视图类指针成员中。
**** 一个文档类对象课对应多个视图 比如多个窗口以不同的方式显示数据***
一个视图对应一个文档
视图类 用一个指针保存和他关联的文档类对象,
所以一个视图类对象只能对应一个文档类对象
文档类 用一个链表保存和他关联的视图类对象,所以一个文档类对象可以对应多个
视图类对象。
}
}
}
WM_CREATE的lParam为CreateWindowEx的12个参数
*****************************************************************
框架窗口的WM_CREATE消息处理 mfc----->win32
CframeWnd::OnCreate(lpCreateStruct){
//函数内部this指针为pFrame,参数为CreateWindowEx的12个参数
CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
//获取了CreateWind
1,MFC文档相关类
用于管理数据,封装了数据和视图窗口之间的操作。CDocument --父类CCmdTarget
2,使用
1,利用CFrameWnd::LoadFrame函数创建框架窗口
2,在框架窗口的WM_CREATE消息中创建视图窗口
3,将视图窗口的WM_REATE消息中将视图类对象和文档类对象进行关系(建立绑定关系)
3.对象关系图
theApp
|-->m_pMainWnd
|-->m_pViewActive
|-->m_pDocument
|-->m_viewList(视图类对象链表)
4.命令消息处理顺序
默认 View-->Document-->FrameWnd-->WinApp
注意顺序可任意更改,也可以添加自己的消息处理类(继承自CCmdTarget)
二 单文档视图构架
1.相关类
CWinApp/CFrameWnd/CView/CDocument - 文档类
CDocTemplate - 文档模板类 (抽象类)
CSingleDocTemplate --单文档模板类
CMultiDocTemplate --多文档模板类
CDocManager --文档管理类
2.使用
关系
theApp
|->m_pDocManager(保存了文档管理类对象地址)
|->m_templateList(文档管理类的链表成员)
|------>|->CSingleDocTemplate
^
|
CSingleDocTemplate
|->m_pDocClass (保存了&CMyDoc::classCMyDoc)
|->m_pFrameClass (保存了&CMyFrameWnd::classCMyFrameWnd)
|->m_pViewClass (保存了&CMyView::classCMyView)
|->m_pOnlyDoc (保存了文档类对象地址)
OnFileNew执行过程
1,通过theApp获取文档管理类对象地址m_pDocManager
2,通过m_pDocManager获取保存在m_templateList链表中的单文档模板类对象地址
3,利用保存在单文档模板类对象中的m_pDocClass来创建文档类对象
3,利用保存在单文档类模板类对象中的m_pFrameClass来动态创建框架类对象。
3,利用框架类对象调用LoadFrame函数创建框架类窗口
4,利用框架窗口的WM_CREATE消息处理动态创建视图类对象并创建视图窗口
5,在视图类窗口WM_CREATE消息处理中将视图类对象和文档类对象进行关联
CWinApp::PreTranslateMessage 处理加速键需重写这个函数
除应用程序类自己定义,其他类都有MFC动态创建
伪代码:
CMyFrameWnd *pFrame=new CMyFrameWnd();
CCreateContext cct;
cct.m_pCurrentDoc=new CMyDocument();
cct.m_pNewViewClass=RUNTIME_CLASS(CMyView);
pFrame->LoadFrame(...,&cct);{ //函数内部this指针为pFrame
Create(...,&cct){ //this=pFrame
CreateEx(...,&cct){
CREATESTRUCT cs;
cs.lpCreateParams=&cct;
.....
::CreateWindow(...,&cct);
//窗口创建 触发框架窗口的WM_CREATE lParam获取cct
}
}
}
伪代码:
OnFileNew(){ //this=theApp;
m_pDocManager->OnFileNew();{
//this=m_pDocManager文档管理类对象
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
//重新获取存放在单文档模板类对象pTemplate的地址
pTemplate->OpenDocumentFile(NULL);{
//this=pTemplate this指针为自己new的单文档类地址
pDocument = CreateNewDocument();{
//this=pTemplate 单文档模板类对象地址
CDocument* pDocument =
(CDocument*)m_pDocClass->CreateObject();
//动态创建文档类对象地址
pFrame = CreateNewFrame(pDocument, NULL);{
//动态创建框架类对象 this=pTemplate
CCreateContext context; //cct
context.m_pCurrentFrame = pOther;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = m_pViewClass;
context.m_pNewDocTemplate = this;
CFrameWnd* pFrame =
(CFrameWnd*)m_pFrameClass->CreateObject();
//动态创建框架类对象 pFrame
pFrame->LoadFrame(m_nIDResource,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // default frame styles
NULL, &context)//context-->cct 实现文档 视图类对象的关联
}
}
}
}
}
*****************************************************************
视图窗口WM_CREATE
CEditView::OnCreate(lpCreateStruct){
//函数内部this指针为pView(动态创建的视图类对象)
//参数为CreateWindowEx函数的12个参数 最后一个cct
CCtrlView::OnCreate(lpCreateStruct){
CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
//获取&cct
pContext->m_pCurrentDoc->AddView(this);{ //this==pView
//函数内部this指针为文档类指针.参数为pView
m_viewList.AddTail(pView);
//将视图类对象地址保存在文档类的一个链表成员中
pView->m_pDocument = this;
//将文档类对子昂地址保存在视图类指针成员中。
**** 一个文档类对象课对应多个视图 比如多个窗口以不同的方式显示数据***
一个视图对应一个文档
视图类 用一个指针保存和他关联的文档类对象,
所以一个视图类对象只能对应一个文档类对象
文档类 用一个链表保存和他关联的视图类对象,所以一个文档类对象可以对应多个
视图类对象。
}
}
}
WM_CREATE的lParam为CreateWindowEx的12个参数
*****************************************************************
框架窗口的WM_CREATE消息处理 mfc----->win32
CframeWnd::OnCreate(lpCreateStruct){
//函数内部this指针为pFrame,参数为CreateWindowEx的12个参数
CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
//获取了CreateWind