【MFC】11.MFC文档和单文档架构-笔记

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();
			}
		}
	}
}
相关推荐
熊猫钓鱼>_>9 小时前
Seedance 2.0 技术深度解析:重构AI视频生成的世界模型新范式
人工智能·笔记·ai·重构·音视频·变革·sedence2.0
小则又沐风a10 小时前
负载均衡式在线OJ---------第二幕
linux·c++·后端
a35354138210 小时前
C++项目如何架构优化
java·c++·架构
天天爱吃肉821810 小时前
【工程师硬件学习笔记:串口‑总线体系与三电试验室异构系统集成深度实战】
大数据·笔记·python·嵌入式硬件·学习·汽车
键盘会跳舞10 小时前
C++:智能指针源码级深度拆解——从 RAII 思想到引用计数的内存安全体系
c++·智能指针·unique_ptr·shared_ptr·weak_ptr
PC2005-cloud10 小时前
Git学习笔记:GitHub Git Data API 完全指南,用 Go 操控 Git 底层对象
笔记·git·学习
一米阳光866110 小时前
软考(中级)软件设计师核心笔记(8)数据结构——图
数据结构·笔记·职场发展·软考·软件设计师·中级职称
SNAKEpc1213810 小时前
OpenGL(十三)- Mip贴图
c语言·c++·图形渲染·贴图
XGeFei19 小时前
【AI应用/Agent智能体搭建平台2】Dify——自部署
人工智能·笔记·学习
祈禾19 小时前
Redis三大缓存问题与分布式锁
运维·数据库·redis·笔记·分布式·缓存