第8章文檔和視圖_第1頁
第8章文檔和視圖_第2頁
第8章文檔和視圖_第3頁
第8章文檔和視圖_第4頁
第8章文檔和視圖_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第8章文檔和視圖

8.1文檔模板

8.2文檔序列化

8.3文檔視圖結(jié)構(gòu)

8.1文檔模板

8.1.1文檔模板類

BOOLCEx_SDIApp::InitInstance() { …

CSingleDocTemplate*pDocTemplate;//單文檔模板 pDocTemplate=newCSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CEx_SDIDoc), RUNTIME_CLASS(CMainFrame),//mainSDIframewindow RUNTIME_CLASS(CEx_SDIView)); AddDocTemplate(pDocTemplate);

… returnTRUE;}8.1.1文檔模板類

BOOLCEx_MDIApp::InitInstance() { …

CMultiDocTemplate*pDocTemplate;//多文檔模板 pDocTemplate=newCMultiDocTemplate( IDR_EX_MDITYPE, //資源ID RUNTIME_CLASS(CEx_MDIDoc), //文檔類

RUNTIME_CLASS(CChildFrame), //MDI文檔窗口類

RUNTIME_CLASS(CEx_MDIView)); //視圖類

AddDocTemplate(pDocTemplate); //創(chuàng)建主框架窗口

CMainFrame*pMainFrame=newCMainFrame; if(!pMainFrame->LoadFrame(IDR_MAINFRAME)) returnFALSE; m_pMainWnd=pMainFrame;

… returnTRUE;}8.1.2文檔模板字串資源(CDocTemplate有相關(guān)成員函數(shù)同樣可以達(dá)到更改效果)

①StringTable資源列表中有一個IDR_MAINFRAME項,用來標(biāo)識文檔類型、標(biāo)題等內(nèi)容,稱為“文檔模板字串資源”

Ex_SDI\n\nEx_SDI\n\n\nExSDI.Document\nEx_SDIDocument②IDR_MAINFRAME標(biāo)識的字符串分成了一些以“\n”結(jié)尾的子串,含義如表。8.2文檔序列化

8.2.1文檔序列化過程-序列化是將數(shù)據(jù)從應(yīng)用程序?qū)懭霐?shù)據(jù)文件或從數(shù)據(jù)文件讀入應(yīng)用程序的過程。序列化在文檔/視圖結(jié)構(gòu)中完成。8.2.2使用CFile類①文件的打開和關(guān)閉

(1)構(gòu)造一個不帶任何參數(shù)的CFile對象;(2)調(diào)用成員函數(shù)Open并指定文件路徑以及文件標(biāo)志。

BOOLOpen(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);(3)使用Close關(guān)閉一個文件對象,若對象在堆內(nèi)存中創(chuàng)建,需調(diào)用delete來刪除它。②文件的讀寫和定位

(1)

UINTRead(void*lpBuf,UINTnCount);(2)voidWrite(constvoid*lpBuf,UINTnCount);(3)LONGSeek(LONGlOff,UINTnFrom);(4)函數(shù)voidSeekToBegin()和DWORDSeekToEnd()③CFile和CArchive類之間的關(guān)聯(lián)(創(chuàng)建CArchive對象有兩種方法:通過框架隱式創(chuàng)建CArchive對象顯式創(chuàng)建CArchive對象)(1)可以將一個外部磁盤文件和一個CArchive對象關(guān)聯(lián)起來。例如:

CFiletheFile; theFile.Open(...,CFile::modeWrite); CArchivearchive(&theFile,CArchive::store);

*CArchive構(gòu)造函數(shù)的原型如下:

CArchive(CFile*pFile,UINTnMode,intnBufSize=4096,void*lpBuf=NULL);

(2)得到與一個CArchive對象關(guān)聯(lián)的CFile類指針,如下面的代碼:

constCFile*fp=ar.GetFile();voidCFileArchiveView::OnTxtRead(){CFilefile("1.txt",CFile::modeRead);CArchivear(&file,CArchive::load);inti;charch;floatf;CStringstr;CStringstrResult;ar>>i>>ch>>f>>str;strResult.Format("%d,%c,%f,%s",i,ch,f,str);MessageBox(strResult);}voidCFileArchiveView::OnTxtSave(){CFilefile("1.txt",CFile::modeCreate|CFile::modeWrite);CArchivear(&file,CArchive::store);inti=4;charch='a';floatf=1.3f;CStringstr("1.txt中的內(nèi)容");ar<<i<<ch<<f<<str;}例1:編程顯式利用CFile和CArchive類進(jìn)行文件的讀寫。MFC框架隱式創(chuàng)建CArchive

對象8.2.3文檔序列化操作

打開和保存文檔時,自動調(diào)用Serialize函數(shù)。創(chuàng)建文檔框架時已在文檔類中重載了Serialize函數(shù)。

voidCEx_SDIDoc::Serialize(CArchive&ar) { if(ar.IsStoring()) //當(dāng)文檔數(shù)據(jù)需要存盤時

{ //TODO:addstoringcodehere } else //當(dāng)文檔數(shù)據(jù)需要讀取時

{ //TODO:addloadingcodehere } }

CArchive類對文件數(shù)據(jù)進(jìn)行緩存,還保存一個標(biāo)識文檔是存入還是載入內(nèi)部標(biāo)記。每次只能有一個活動的存檔與ar相連。

CArchive類可以簡化文件操作,提供“<<”和“>>”運算符,用于向文件寫入簡單的數(shù)據(jù)類型以及從文件中讀取它們,如表。

CArchive類提供成員函數(shù)ReadString和WriteString從一個文件對象中讀寫一行文本,原型:

BoolReadString(CString&rString); LPTSTRReadString(LPTSTRlpsz,UINTnMax); voidWriteString(LPCTSTRlpsz);例2:在利用MFC生成的單文檔程序中實現(xiàn)文檔的讀取。(1)用MFCAppWizard創(chuàng)建一個默認(rèn)的單文檔應(yīng)用程序Ex_SDIArchive。(2)打開StringTable資源,文檔模板字串資源IDR_MAINFRAME內(nèi)容修改:

文檔序列化操作\n\n\n自定義文件(*.my)\n.my\nExSDIArchive.Document\nEx_SDIDocument(3)為CEx_SDIArchiveDoc類添加下列成員變量:

public:

CStringm_strData;(4)在CEx_SDIArchiveDoc類OnNewDocument函數(shù)中添加下列代碼: BOOLCEx_SDIArchiveDoc::OnNewDocument(){…m_strData="這a是一行文本!";returnTRUE;}(5)在CEx_SDIArchiveDoc::Serialize函數(shù)中添加下列代碼:

voidCEx_SDIArchiveDoc::Serialize(CArchive&ar) { if(ar.IsStoring()) ar.WriteString(m_strData);elsear.ReadString(m_strData);}(6)為CEx_SDIArchiveView類添加下列成員變量:

public:

CStringm_str;(7)在CEx_SDIArchiveView類OnDraw函數(shù)中添加下列代碼:voidCEx_SDIArchiveView::OnDraw(CDC*pDC){…m_str=pDoc->m_strData;pDC->TextOut(100,50,m_str);}(8)為CEx_SDIArchiveView類OnChar函數(shù)中添加下列代碼:voidCEx_SDIArchiveView::OnChar(UINTnChar,UINTnRepCnt,UINTnFlags){CMy33Doc*pDoc=GetDocument();if(nChar=='\b')m_str.Delete(m_str.GetLength()-1,1);elsem_str+=(char)nChar;Invalidate();pDoc->m_strData=m_str;pDoc->SetModifiedFlag(1);CView::OnChar(nChar,nRepCnt,nFlags);}8.3文檔視圖結(jié)構(gòu)

8.3.1文檔與視圖的相互作用

①CView::GetDocument函數(shù)//視圖對象包含的GetDocument函數(shù)允許應(yīng)用程序由視圖得到與之相關(guān)聯(lián)的文檔。GetDocument函數(shù)返回的是指向文檔的指針。②CDocument::UpdateAllViews函數(shù)

voidUpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL);

//如果參數(shù)pSender指向某個特定的視圖對象,那么除了該指定的視圖之外,文檔的所有其他視圖的OnUpdate函數(shù)都會被調(diào)用。③CView::OnUpdate函數(shù)

virtualvoidOnUpdate(CView*pSender,LPARAMlHint=0,CObject*pHint=NULL);//參數(shù)pSender表示文檔被更改的所關(guān)聯(lián)的視圖類指針。

lHint=0,pHint=NULL使得整個窗口矩形無效。④CView::OnInitialUpdate函數(shù)

//應(yīng)用程序被啟動時,或“文件”菜單中選擇了“新建”或“打開”時,被自動調(diào)用。該函數(shù)除了調(diào)用無提示參數(shù)的OnUpdate函數(shù)之外,沒有其他任何操作。⑤CDocument::OnNewDocument函數(shù)

在文檔應(yīng)用程序中,“文件”菜單中選擇“新建”命令時,框架將首先構(gòu)造一個文檔對象,然后調(diào)用該虛函數(shù)。這里是設(shè)置文檔數(shù)據(jù)成員初始值的好地方,當(dāng)然文檔數(shù)據(jù)成員初始化處理還有其他的一些方法。

8.3.2應(yīng)用程序?qū)ο笾羔樀幕フ{(diào)①從文檔類中獲取視圖對象指針

virtualPOSITIONGetFirstViewPosition()const; virtualCView*GetNextView(POSITION&rPosition)const;例子:

POSITIONpos=GetFirstViewPosition();

while(pos!=NULL)

{

CView*pView=GetNextView(pos);

........................

}②從視圖類中獲取文檔對象和主框架對象指針 在視圖類中獲取文檔對象指針只需調(diào)用視圖類中的成員函數(shù)GetDocument。函數(shù)CWnd::GetParen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論