【MFC】文档类

文档类的作用

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

文档类的使用

定义一个自己的文档类,派生自CDocument
其余具体见代码

#include<afxwin.h>
#include<afxext.h>
#include "resource.h"
class CMyDoc :public CDocument {

};

class CMyView :public CView {
	DECLARE_DYNCREATE(CMyView)//支持动态创建机制
public:
	virtual void OnDraw(CDC* pDC);
};
IMPLEMENT_DYNCREATE(CMyView,CView)//支持动态创建机制
void CMyView::OnDraw(CDC* pDC) {

}

class CMyFrameWnd :public CFrameWnd {

};

class CMyWinApp :public CWinApp {
public:
	virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance() {
	CMyFrameWnd* pFrame = new CMyFrameWnd;
	CMyDoc* pDoc = new CMyDoc;

	CCreateContext cct;
	cct.m_pCurrentDoc = pDoc;//文档类对象地址

	cct.m_pNewViewClass = RUNTIME_CLASS(CMyView);//&CMyView::classCMyview
	pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&cct);
	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return true;
}

CMyWinApp theApp;

程序框架创建过程

在这里插入图片描述1. 利用框架类对象地址(pFrame)调用LoadFrame函数,创建框架窗口
2. 在处理框架窗口的WM_CREATE消息时,(默认父类OnCreate)动态创建视图类对象,并创建视图窗口
3. 在处理视图窗口的WM_CREATE消息时,(默认父类)将文档对象和视图类对象建立关联联系

#include<afxwin.h>
#include<afxext.h>
#include "resource.h"
class CMyDoc :public CDocument {

};

class CMyView :public CView {
	DECLARE_DYNCREATE(CMyView)//支持动态创建机制
	DECLARE_MESSAGE_MAP()
public:
	virtual void OnDraw(CDC* pDC);
	afx_msg int OnCreate(LPCREATESTRUCT pcs);
};
BEGIN_MESSAGE_MAP(CMyView,CView)
	ON_WM_CREATE()
END_MESSAGE_MAP()
IMPLEMENT_DYNCREATE(CMyView,CView)//支持动态创建机制
int CMyView::OnCreate(LPCREATESTRUCT pcs) {
	return CView::OnCreate(pcs);//将文档对象和视图类对象建立关联联系
}
void CMyView::OnDraw(CDC* pDC) {
	pDC->TextOutA(100, 100, "视图窗口");
}

class CMyFrameWnd :public CFrameWnd {
	DECLARE_MESSAGE_MAP()
public:
	afx_msg int OnCreate(LPCREATESTRUCT pcs);
	afx_msg void OnPaint();
};
int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) {
	return CFrameWnd::OnCreate(pcs);//动态创建视图类对象,并创建视图窗口
}
void CMyFrameWnd::OnPaint() {
	PAINTSTRUCT ps = { 0 };
	HDC hdc = ::BeginPaint(this->m_hWnd, &ps);
	::TextOut(hdc, 200, 200, "框架窗口客户区", strlen("框架窗口客户区"));
	::EndPaint(this->m_hWnd, &ps);
}
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
	ON_WM_PAINT()
	ON_WM_CREATE()
END_MESSAGE_MAP()

class CMyWinApp :public CWinApp {
public:
	virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance() {
	CMyFrameWnd* pFrame = new CMyFrameWnd;
	CMyDoc* pDoc = new CMyDoc;

	CCreateContext cct;
	cct.m_pCurrentDoc = pDoc;//文档类对象地址

	cct.m_pNewViewClass = RUNTIME_CLASS(CMyView);//&CMyView::classCMyview
	pFrame->LoadFrame(IDR_MENU1, WS_OVERLAPPEDWINDOW,NULL,&cct);
	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return true;
}

CMyWinApp theApp;

对象关系图

在这里插入图片描述

窗口切分

相关类 CSplitterWnd类——不规则框架窗口类,封装不规则框架窗口的操作
CFrameWnd——规则框架窗口类
使用:
重写CFrameWnd类的成员虚函数OnCreateClient
在虚函数中调用CSplitterWnd::CreateStatic创建不规则框架窗口
在虚函数中调用CSplitterWnd::CreateView创建视图窗口

#include<afxwin.h>
#include<afxext.h>
#include "resource.h"
class CMyDoc :public CDocument {

};

class CMyView :public CView {
	DECLARE_DYNCREATE(CMyView)//支持动态创建机制
	DECLARE_MESSAGE_MAP()
public:
	virtual void OnDraw(CDC* pDC);
	afx_msg int OnCreate(LPCREATESTRUCT pcs);
};
BEGIN_MESSAGE_MAP(CMyView,CView)
	ON_WM_CREATE()
END_MESSAGE_MAP()
IMPLEMENT_DYNCREATE(CMyView,CView)//支持动态创建机制
int CMyView::OnCreate(LPCREATESTRUCT pcs) {
	return CView::OnCreate(pcs);//将文档对象和视图类对象建立关联联系
}
void CMyView::OnDraw(CDC* pDC) {
	pDC->TextOutA(100, 100, "视图窗口");
}

class CMyFrameWnd :public CFrameWnd {
	DECLARE_MESSAGE_MAP()
public:
	afx_msg int OnCreate(LPCREATESTRUCT pcs);
	afx_msg void OnPaint();
	virtual BOOL OnCreateClient(LPCREATESTRUCT pcs, CCreateContext* pContext);
	CSplitterWnd split;//不规则框架窗口
};
BOOL CMyFrameWnd::OnCreateClient(LPCREATESTRUCT pcs, CCreateContext* pContext) {
	//创建两个视图窗口
	split.CreateStatic(this, 1, 2);
	split.CreateView(0, 0, RUNTIME_CLASS(CMyView), CSize(100, 100), pContext);
	split.CreateView(0, 1, pContext->m_pNewViewClass, CSize(100, 100), pContext);
	return true;//不能返回父类
}
int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) {
	return CFrameWnd::OnCreate(pcs);//动态创建视图类对象,并创建视图窗口
}
void CMyFrameWnd::OnPaint() {
	PAINTSTRUCT ps = { 0 };
	HDC hdc = ::BeginPaint(this->m_hWnd, &ps);
	::TextOut(hdc, 200, 200, "框架窗口客户区", strlen("框架窗口客户区"));
	::EndPaint(this->m_hWnd, &ps);
}
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
	ON_WM_PAINT()
	ON_WM_CREATE()
END_MESSAGE_MAP()

class CMyWinApp :public CWinApp {
public:
	virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance() {
	CMyFrameWnd* pFrame = new CMyFrameWnd;
	CMyDoc* pDoc = new CMyDoc;

	CCreateContext cct;
	cct.m_pCurrentDoc = pDoc;//文档类对象地址

	cct.m_pNewViewClass = RUNTIME_CLASS(CMyView);//&CMyView::classCMyview
	pFrame->LoadFrame(IDR_MENU1, WS_OVERLAPPEDWINDOW,NULL,&cct);
	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return true;
}

CMyWinApp theApp;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值