?? mfc學(xué)習(xí)進(jìn)階04.txt
字號(hào):
大家好,這是第四期。
在上一次,一位朋友說(shuō)到視圖,文檔簡(jiǎn)單的講就是一個(gè)類(lèi),只不過(guò)這個(gè)類(lèi)有著前面我們所說(shuō)的功能,可以改
善程序的結(jié)構(gòu)。那我們先來(lái)看看這兩個(gè)類(lèi):
1。文檔類(lèi)
文檔類(lèi)是由CDocument類(lèi)派生出來(lái)的,CDocument類(lèi)可以進(jìn)行文檔的創(chuàng)建,載入,儲(chǔ)存等。下面講幾
個(gè)成員函數(shù)CDocument(),OnNewDocument(),OnOpenDocument(),OnSaveDocument();
CDocument()當(dāng)然是一個(gè)構(gòu)造函數(shù),用來(lái)構(gòu)造一個(gè)CDocument類(lèi),通常不用調(diào)用這個(gè)函數(shù),因?yàn)槲臋n
模板可以用來(lái)創(chuàng)建這個(gè)類(lèi)對(duì)象。
OnNewDocument() 調(diào)用DeleteContents,保證文檔為空,然后置新文檔為空。可以重載該函數(shù)為運(yùn)
用程序的文檔類(lèi)型初始化它的數(shù)據(jù)結(jié)構(gòu)。
OnOpenDocument()用來(lái)打開(kāi)指定的文件,先調(diào)用DeleteContents,保證文檔為空,然后調(diào)用
CObject::Serialize讀出文件內(nèi)容,然后置文檔為清潔。
OnSaveDocument()打開(kāi)指定文件之后,調(diào)用CObject::Serialize,將文檔寫(xiě)入文件。
以上都是我從專(zhuān)門(mén)的參考資料下抄的,不懂的話(huà)可以先放放。看來(lái)文檔是用來(lái)管理文件的哈!
2。視圖類(lèi)
視圖類(lèi)是由CView類(lèi)派生出來(lái)的,這個(gè)視圖,是與文檔聯(lián)系起來(lái),可以將用戶(hù)的操作轉(zhuǎn)化為對(duì)文檔
的操作,比如說(shuō)將用戶(hù)的輸入解釋成文檔的操作。(可以想象視圖類(lèi)一定有函數(shù)來(lái)與文檔聯(lián)系,可能是要取
得文檔指針;還有必須有能將用戶(hù)輸入轉(zhuǎn)化為文檔操作的函數(shù))
下面我又去找?guī)讉€(gè)代表性的成員函數(shù)
GetDocument(),這個(gè)函數(shù)獲得該視圖的文檔的指針。
我沒(méi)有找到一個(gè)具體的實(shí)現(xiàn)把用戶(hù)輸入轉(zhuǎn)化為文檔的函數(shù),但是我倒是看到很多關(guān)于打印的函數(shù)。
好,現(xiàn)在我們用我們前面學(xué)的東西來(lái)看看以文檔/視圖為結(jié)構(gòu)的Skeleton程序,這個(gè)新的程序我們命名為
SkeletonDV。
下面看看文檔對(duì)象的實(shí)現(xiàn)。
//file of skeletonDoc.h
#ifndef _SKELETONDOC_H_
#define _SKELETONDOC_H_
class CSkeletonDoc:public CDocument{
public:
CSkeletonDoc();
virtual ~CSkeletonDoc();
//好象這本書(shū)的代碼都把這兩個(gè)函數(shù)放到這個(gè)地方
public:
virtual BOOL OnNewDocument();
//這個(gè)函數(shù)初始化一個(gè)空文檔
virtual void Serialize(CArchive&ar);
//這個(gè)函數(shù)用來(lái)保存文檔
public:
#ifdef DEBUG
virtual void AssertValid()const;
virtual void Dump(CDumpContext&dc)const;
#endif
//這個(gè)是個(gè)新玩藝,查一查,把這兩個(gè)函數(shù)放到DEBUG宏里時(shí),只能編譯到調(diào)試版本中,用戶(hù)是看不到的。
所以里面的函數(shù)多半是用來(lái)檢測(cè)用的。
//AssertValid通過(guò)對(duì)象的中間狀態(tài),執(zhí)行有效性檢查。什么叫有效性檢查?
//Dump用來(lái)轉(zhuǎn)儲(chǔ)對(duì)象內(nèi)容,以便檢查它的中間狀態(tài)。
protected:
DECLARE_MESSAGE_MAP()
DECLARE_DYNCREATE(CSkeletonDoc)
//如果我沒(méi)有記錯(cuò),這就是消息映射
};
#endif
下面是它的實(shí)現(xiàn)文件
//the file of SKeletonDoc.cpp
#include"StdAfx.h"
#include"SkeletonDoc.h"
#ifdef DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[]=__FILE__;
#endif
BEGIN_MESSAGE_MAP(CSkeletonDoc,CDocument)
END_MESSAGE_MAP()
IMPLEENT_DYNCREATE(CSkeletonDoc,CDocument)
CSkeletonDoc::CSkeletonDoc()
{};
CSkeletonDoc::~CSkeletonDoc()
{};
BOOL CSkeletonDco::OnNewDocument(){
if(!CDocument:OnNewDocument())
return FALSE;
//初始化文檔
//因?yàn)檫@是一個(gè)最簡(jiǎn)單的程序,所以沒(méi)有其他代碼。這里可以添加其他代碼
return TURE;
}
void CSkeletonDoc::Serialize(CArchive&ar)
{
if(ar.lsStoring()){
//保存文檔
//這里添加代碼
}
else
{
//添加代碼以載入文檔
}
}
#ifdef DEBUG
void CSkeletonDoc::AssertValid()const{
CDocument::AssertValid();
}
//這個(gè)函數(shù)可以檢查自己的成員書(shū)句的完整性。因?yàn)檫@個(gè)類(lèi)沒(méi)有定義的成員數(shù)據(jù),里面沒(méi)有什么代碼
void CSkeletonDoc::Dump(CDumpContext&dc)const{
CDocument::Dump(dc);
}
//這個(gè)函數(shù)用來(lái)轉(zhuǎn)儲(chǔ)對(duì)象的內(nèi)容,因?yàn)轭?lèi)中沒(méi)有什么自定義的成員函數(shù),所以沒(méi)有什么要轉(zhuǎn)儲(chǔ)的內(nèi)容
#endif
以上就是文檔類(lèi)的實(shí)現(xiàn),同志們可以多查點(diǎn)資料。好,這次就到這(明天要考試!不好意思)
下次的內(nèi)容是視圖類(lèi)的實(shí)現(xiàn)了,下次見(jiàn)。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -