相关类
CDocument提供了一个用于管理数据的类,封装了关于数据的管理(数据提取、数据转换、数据存储等),并和视图类进行数据交互。
文档类使用
定义一个自己的文档类,派生自CDocument
程序的创建过程
1.利用框架类对象地址pFrame调用LoadFrame函数,创建框架窗口
2.在处理框架窗口的WM_CREATE消息时,动态创建视图类对象,并创建视图窗口
3.在处理视图窗口的WM_CREATE消息时,将文档类对象和视图类对象建立关联关系。
文档类对象用一个链接成员变量,保存视图类对象地址
视图类对象用一个普通成员变量,保存文档类对象地址
一个文档类对象可以对应多个视图类对象,而一个视图类对象只能对应一个文档类对象。
窗口切分
相关类
CSplitterWnd-不规则框架窗口类,封装了关于不规则框架窗口的操作。
窗口切分的使用
- 重写CFrameWnd类的成员虚函数OnCreateClient
- 在虚函数中调用CSplitterWnd::CreateStatic创建不规则框架窗口
- 在虚函数中调用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;