【上位机——MFC】文档

相关类

CDocument提供了一个用于管理数据的类,封装了关于数据的管理(数据提取、数据转换、数据存储等),并和视图类进行数据交互。

文档类使用

定义一个自己的文档类,派生自CDocument

程序的创建过程

1.利用框架类对象地址pFrame调用LoadFrame函数,创建框架窗口

2.在处理框架窗口的WM_CREATE消息时,动态创建视图类对象,并创建视图窗口

3.在处理视图窗口的WM_CREATE消息时,将文档类对象和视图类对象建立关联关系。

文档类对象用一个链接成员变量,保存视图类对象地址

视图类对象用一个普通成员变量,保存文档类对象地址

一个文档类对象可以对应多个视图类对象,而一个视图类对象只能对应一个文档类对象。

窗口切分

相关类

CSplitterWnd-不规则框架窗口类,封装了关于不规则框架窗口的操作。

窗口切分的使用

  1. 重写CFrameWnd类的成员虚函数OnCreateClient
  2. 在虚函数中调用CSplitterWnd::CreateStatic创建不规则框架窗口
  3. 在虚函数中调用CSplitterWnd::CreateView创建视图窗口

文档类和视图类的关系

视图类成员函数

获取和视图类对象关联的文档类对象,调用GetDocument()
文档类成员函数

当文档类数据发生变化时,调用UpDataAllViews刷新和文档类对象相关联的视图类对象(视图窗口)。

代码示例

cpp 复制代码
#include <afxwin.h>
#include <afxext.h>
#include "resource.h"

class CMyDoc : public CDocument {
	DECLARE_MESSAGE_MAP()

public:
	afx_msg void OnNew();

	CString str;

};

BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
	ON_COMMAND(ID_NEW, &CMyDoc::OnNew)
END_MESSAGE_MAP()

void CMyDoc::OnNew()
{
	str = "Hello World"; // 接收到的数据
	//this->UpdateAllViews(NULL); // 刷新和这个文档类对象关联的所有视图窗口
	//this->m_viewList;
	POSITION pos = this->GetFirstViewPosition();//拿到m_viewList链表的迭代器
	CView* pView = this->GetNextView(pos);	//得到第一个节点 再调一遍this->GetNextView(pos); 获取第二个节点

	this->UpdateAllViews(pView); // 刷新除了pView 这个视图窗口之外的其他视图窗口

}


class CMyView : public CView {
	DECLARE_DYNCREATE(CMyView) // 动态创建机制 声明
		DECLARE_MESSAGE_MAP()
public :
	virtual void OnDraw(CDC* pDC);
	afx_msg int OnCreate(LPCREATESTRUCT pcs);
};
IMPLEMENT_DYNCREATE(CMyView, CView) // 动态创建机制 实现

BEGIN_MESSAGE_MAP(CMyView, CView)
	//ON_WM_CREATE()
END_MESSAGE_MAP()

int CMyView::OnCreate(LPCREATESTRUCT pcs) {
	return CMyView::OnCreate(pcs); 
}

void CMyView::OnDraw(CDC* pDC) {
	//获取与当前视图对象相关的文档类
	// 方式一
	//CMyDoc* pDoc = (CMyDoc*)this->m_pDocument;
	// 方式二
	CMyDoc* pDoc = (CMyDoc*)this->GetDocument();

	pDC->TextOut(100,100, pDoc->str);
}

class CMyFrameWnd :public CFrameWnd {
	DECLARE_MESSAGE_MAP()
public:
	afx_msg int OnCreate(LPCREATESTRUCT pcs);

	virtual BOOL OnCreateClient(LPCREATESTRUCT pcs ,CCreateContext* pContext);

public:
	CSplitterWnd split;

};
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
	ON_WM_CREATE()
END_MESSAGE_MAP()

int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) {
	return CFrameWnd::OnCreate(pcs);// 动态创建视图类对象,并创建视图窗口
}

//窗口切分
BOOL CMyFrameWnd::OnCreateClient(LPCREATESTRUCT pcs, CCreateContext* pContext) {
	//创建2个视图窗口		
	split.CreateStatic(this,1,2);
	split.CreateView(0,0,pContext->m_pNewViewClass,CSize(100,100),pContext);
	split.CreateView(0,1,pContext->m_pNewViewClass, CSize(100, 100), pContext);

	return true;
}

class CMyWinApp :public CWinApp {
public:
	virtual BOOL InitInstance();
};

BOOL CMyWinApp::InitInstance() {
	CMyFrameWnd* pFrame = new CMyFrameWnd;

	CMyDoc* pDoc = new CMyDoc;

	CCreateContext cc;
	cc.m_pNewViewClass = RUNTIME_CLASS(CMyView);// 拿到CMyView类的静态变量&CMyView::classCMyView
	cc.m_pCurrentDoc = pDoc;

	//创建了框架窗口
	pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&cc);

	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();


	return TRUE;
}

CMyWinApp theApp;
相关推荐
程序猿编码27 分钟前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
言乐61 小时前
Python实现语音审核模型
开发语言·python·django·virtualenv·pygame
朝朝辞暮i2 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
SHARK_pssm2 小时前
【C++——类和对象(下)】
开发语言·c++·经验分享·笔记
凯哥Java2 小时前
写代码怎么避免逻辑漏洞?
java·开发语言·人工智能·自动化
汉克老师3 小时前
GESP2026年9月认证C++二级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
Ai-_Man3 小时前
您您这可以把Dola的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。用AI导出鸭,答案是可以的
开发语言·前端·人工智能·小程序
Java后端的Ai之路3 小时前
Python进阶探索23 - Python中的Time与Datetime模块
开发语言·数据库·python·datetime·time
沫璃染墨3 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
Java后端的Ai之路4 小时前
Python进阶探索24_应用案例_linux系统的监控
linux·开发语言·python·应用·探索