软件开发中,数据非常重要。使用VS2008开发软件时,也会产生CApp,CDoc,CView和CMainFrame几个模块。那么,这其中数据是如何流向的呢?
MyData数据文件
CDoc数据管理入口
CApp数据管理
CMainFrame数据操作
CView数据显示
一.使用默认文档模板
1.新建单文档应用程序
2.添加数据文件
数据结构和头文件,如果有文件相关操作,比如打开关闭等,可以在源文件中操作。
struct tFILE_INFO
{
CString sFileVer; //文件版本
CString sAuthor; //文件作者
CString sProDes; //项目信息
CString sRightDes; //所有权描述
tFILE_INFO()
{
sFileVer = _T("V1.0");
sAuthor = _T("songli");
sProDes = _T("Test");
sRightDes = _T("This is a test!");
}
tFILE_INFO& operator = (tFILE_INFO& item)
{
sFileVer = item.sFileVer;
sAuthor = item.sAuthor;
sProDes = item.sProDes;
sRightDes = item.sRightDes;
return *this;
}
};
class CMyData
{
public:
CMyData(void);
~CMyData(void);
tFILE_INFO m_FileInfo;
CMyData& operator = (CMyData& item)
{
m_FileInfo = item.m_FileInfo;
return *this;
}
};
3.在CDoc中添加数据成员变量
public:
CMyData m_MyData;
4.在CMainFrm中使用数据
头文件
private:
CDataStreamDemoDoc* m_pDoc;
public:
CDataStreamDemoDoc* GetDocument() {return m_pDoc;}
protected:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
源文件
CMainFrame::CMainFrame()
{
m_pDoc = NULL;
}
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
m_pDoc = (CDataStreamDemoDoc*)(pContext->m_pCurrentDoc);
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
5.在CView中显示数据
头文件
class CDataStreamDemoView : public CEditView
{
public:
virtual void OnInitialUpdate();
CDataStreamDemoDoc* GetDocument() const;
void UpdateEditView();
}
源文件
void CDataStreamDemoView::OnInitialUpdate()
{
CEditView::OnInitialUpdate();
CEdit& edit = GetEditCtrl();
edit.SetReadOnly(TRUE);
UpdateEditView();
}
CDataStreamDemoDoc* CDataStreamDemoView::GetDocument() const
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDataStreamDemoDoc)));
return (CDataStreamDemoDoc*)m_pDocument;
}
void CDataStreamDemoView::UpdateEditView()
{
CMyData& data = GetDocument()->m_MyData;
CString sText = _T("");
CString str = _T("");
str.Format("文件版本:[%s] \r\n",data.m_FileInfo.sFileVer);
sText = sText + str;
str.Format("文件作者:[%s] \r\n",data.m_FileInfo.sAuthor);
sText = sText + str;
str.Format("项目信息:[%s] \r\n",data.m_FileInfo.sProDes);
sText = sText + str;
str.Format("所有权描述:[%s] \r\n",data.m_FileInfo.sRightDes);
sText = sText + str;
CEdit& edit = GetEditCtrl();
edit.SetWindowTextA(sText);
}
二.使用自定义文档模板
前三项与上一样
1.新建单文档应用程序
1.新建单文档应用程序
2.添加数据文件
3.在CDoc中添加数据变量
4.在CApp中添加数据管理
头文件
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
private:
CDataStreamDemoDoc* m_pDoc;
public:
CDataStreamDemoDoc* GetDocument();
源文件
CDataStreamDemoApp::CDataStreamDemoApp()
{
m_pDoc = NULL;
}
BOOL CDataStreamDemoApp::InitInstance()
{
//在文档、框架窗口和视图之间的连接之前
m_pDoc = new CDataStreamDemoDoc;
if(!m_pDoc)
{
return FALSE;
}
}
int CDataStreamDemoApp::ExitInstance()
{
if(m_pDoc)
{
delete m_pDoc;
m_pDoc = NULL;
}
return CWinApp::ExitInstance();
}
CDataStreamDemoDoc* CDataStreamDemoApp::GetDocument()
{
ASSERT(m_pDoc->IsKindOf(RUNTIME_CLASS(CDataStreamDemoDoc)));
return m_pDoc;
}
5.在CMainFrm和CView中使用和显示数据
头文件
public:
CDataStreamDemoDoc* GetDocument();
源文件
CDataStreamDemoDoc* CMainFrame::GetDocument()
{
return ((CDataStreamDemoApp*)AfxGetApp())->GetDocument();
}
其中,我们可以看出,主要区别在于:在CApp中新建了一个文档变量(具体查看自定义文档的第4项),在使用中对于文档的指向也有所改变。
CDataStreamDemoDoc* CDataStreamDemoView::GetDocument() const
{
//默认数据模板
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDataStreamDemoDoc)));
return (CDataStreamDemoDoc*)m_pDocument;
//新建数据模板
return ((CDataStreamDemoApp*)AfxGetApp())->GetDocument();
}