文档类的作用
相关类 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;