




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第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資源列表中有一個(gè)IDR_MAINFRAME項(xiàng),用來標(biāo)識(shí)文檔類型、標(biāo)題等內(nèi)容,稱為“文檔模板字串資源”
Ex_SDI\n\nEx_SDI\n\n\nExSDI.Document\nEx_SDIDocument②IDR_MAINFRAME標(biāo)識(shí)的字符串分成了一些以“\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)造一個(gè)不帶任何參數(shù)的CFile對(duì)象;(2)調(diào)用成員函數(shù)Open并指定文件路徑以及文件標(biāo)志。
BOOLOpen(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);(3)使用Close關(guān)閉一個(gè)文件對(duì)象,若對(duì)象在堆內(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對(duì)象有兩種方法:通過框架隱式創(chuàng)建CArchive對(duì)象顯式創(chuàng)建CArchive對(duì)象)(1)可以將一個(gè)外部磁盤文件和一個(gè)CArchive對(duì)象關(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)得到與一個(gè)CArchive對(duì)象關(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
對(duì)象8.2.3文檔序列化操作
打開和保存文檔時(shí),自動(dòng)調(diào)用Serialize函數(shù)。創(chuàng)建文檔框架時(shí)已在文檔類中重載了Serialize函數(shù)。
voidCEx_SDIDoc::Serialize(CArchive&ar) { if(ar.IsStoring()) //當(dāng)文檔數(shù)據(jù)需要存盤時(shí)
{ //TODO:addstoringcodehere } else //當(dāng)文檔數(shù)據(jù)需要讀取時(shí)
{ //TODO:addloadingcodehere } }
CArchive類對(duì)文件數(shù)據(jù)進(jìn)行緩存,還保存一個(gè)標(biāo)識(shí)文檔是存入還是載入內(nèi)部標(biāo)記。每次只能有一個(gè)活動(dòng)的存檔與ar相連。
CArchive類可以簡(jiǎn)化文件操作,提供“<<”和“>>”運(yùn)算符,用于向文件寫入簡(jiǎn)單的數(shù)據(jù)類型以及從文件中讀取它們,如表。
CArchive類提供成員函數(shù)ReadString和WriteString從一個(gè)文件對(duì)象中讀寫一行文本,原型:
BoolReadString(CString&rString); LPTSTRReadString(LPTSTRlpsz,UINTnMax); voidWriteString(LPCTSTRlpsz);例2:在利用MFC生成的單文檔程序中實(shí)現(xiàn)文檔的讀取。(1)用MFCAppWizard創(chuàng)建一個(gè)默認(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ù)//視圖對(duì)象包含的GetDocument函數(shù)允許應(yīng)用程序由視圖得到與之相關(guān)聯(lián)的文檔。GetDocument函數(shù)返回的是指向文檔的指針。②CDocument::UpdateAllViews函數(shù)
voidUpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL);
//如果參數(shù)pSender指向某個(gè)特定的視圖對(duì)象,那么除了該指定的視圖之外,文檔的所有其他視圖的OnUpdate函數(shù)都會(huì)被調(diào)用。③CView::OnUpdate函數(shù)
virtualvoidOnUpdate(CView*pSender,LPARAMlHint=0,CObject*pHint=NULL);//參數(shù)pSender表示文檔被更改的所關(guān)聯(lián)的視圖類指針。
lHint=0,pHint=NULL使得整個(gè)窗口矩形無效。④CView::OnInitialUpdate函數(shù)
//應(yīng)用程序被啟動(dòng)時(shí),或“文件”菜單中選擇了“新建”或“打開”時(shí),被自動(dòng)調(diào)用。該函數(shù)除了調(diào)用無提示參數(shù)的OnUpdate函數(shù)之外,沒有其他任何操作。⑤CDocument::OnNewDocument函數(shù)
在文檔應(yīng)用程序中,“文件”菜單中選擇“新建”命令時(shí),框架將首先構(gòu)造一個(gè)文檔對(duì)象,然后調(diào)用該虛函數(shù)。這里是設(shè)置文檔數(shù)據(jù)成員初始值的好地方,當(dāng)然文檔數(shù)據(jù)成員初始化處理還有其他的一些方法。
8.3.2應(yīng)用程序?qū)ο笾羔樀幕フ{(diào)①?gòu)奈臋n類中獲取視圖對(duì)象指針
virtualPOSITIONGetFirstViewPosition()const; virtualCView*GetNextView(POSITION&rPosition)const;例子:
POSITIONpos=GetFirstViewPosition();
while(pos!=NULL)
{
CView*pView=GetNextView(pos);
........................
}②從視圖類中獲取文檔對(duì)象和主框架對(duì)象指針 在視圖類中獲取文檔對(duì)象指針只需調(diào)用視圖類中的成員函數(shù)GetDocument。函數(shù)CWnd::GetParen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人造革的環(huán)保標(biāo)準(zhǔn)與認(rèn)證流程考核試卷
- 某研究院財(cái)務(wù)規(guī)劃管理制度及流程
- 輔警轉(zhuǎn)正工作總結(jié)
- 煙臺(tái)市重點(diǎn)中學(xué)2025屆高三三調(diào)(5月)數(shù)學(xué)試題試卷
- 桌子創(chuàng)意美術(shù)課件
- 2025年份第一季度離婚協(xié)議中房產(chǎn)增值部分分割細(xì)則
- 《社會(huì)工作倫理》課件:實(shí)踐原則與案例分析
- 2025年4月份離婚協(xié)議中危險(xiǎn)病原體保管責(zé)任約定
- 標(biāo)準(zhǔn)個(gè)人借款擔(dān)保合同范例二零二五年
- 全新機(jī)房搬遷協(xié)議合同
- 廣東廣州市海珠區(qū)官洲街道辦事處政府雇員公開招聘5人(必考題)模擬卷含答案
- (完整word)2019注冊(cè)消防工程師繼續(xù)教育三科試習(xí)題及答案
- 結(jié)構(gòu)膠msdslord第一部分化學(xué)產(chǎn)品和公司名稱
- 低血糖昏迷搶救預(yù)案及流程
- 新教材教科版四年級(jí)下冊(cè)科學(xué)全冊(cè)課時(shí)練(同步練習(xí))(共24課)
- 從專業(yè)走向管理
- 2022年中國(guó)礦業(yè)權(quán)評(píng)估新準(zhǔn)則
- 抵押物清單(標(biāo)準(zhǔn)樣本)
- DB11-T 527-2021配電室安全管理規(guī)范
- 《物聯(lián)網(wǎng)》課件第4章-物聯(lián)網(wǎng)通信技術(shù)
- 2010年個(gè)人所得稅稅率表
評(píng)論
0/150
提交評(píng)論