文檔與視圖結(jié)構(gòu)_第1頁
文檔與視圖結(jié)構(gòu)_第2頁
文檔與視圖結(jié)構(gòu)_第3頁
文檔與視圖結(jié)構(gòu)_第4頁
文檔與視圖結(jié)構(gòu)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 第第5 5章章 文檔與視圖結(jié)構(gòu)文檔與視圖結(jié)構(gòu) 了解文檔了解文檔/ /視圖結(jié)構(gòu)視圖結(jié)構(gòu) 掌握在視中顯示數(shù)據(jù)方法掌握在視中顯示數(shù)據(jù)方法 利用利用CFileCFile類對文檔數(shù)據(jù)的存儲和裝入類對文檔數(shù)據(jù)的存儲和裝入 利用串行化對文檔數(shù)據(jù)的存儲和裝入利用串行化對文檔數(shù)據(jù)的存儲和裝入教學(xué)目標Visual C+Visual C+程序設(shè)計電子教案程序設(shè)計電子教案-王明福編王明福編 教學(xué)內(nèi)容 程序演示文檔與視圖的概念 單文檔應(yīng)用程序(SDI) 文檔的存儲和裝入 添加串行化功能 5.1 5.1 學(xué)生檔案管理程序 返回目錄返回目錄v 程序運行結(jié)果v 程序運行演示 學(xué)生檔案管理程序(續(xù)) 返返 回回三大功能:1.

2、數(shù)據(jù)記錄的錄入 2.文檔數(shù)據(jù)的存儲和裝入 3.數(shù)據(jù)記錄的瀏覽功能分解:1.創(chuàng)建一個單文檔學(xué)生檔案管理應(yīng)用程序,具有錄入、瀏覽功能; 2.改進MySdi程序,利用CFile類,添加文檔數(shù)據(jù)存儲和裝入功能; 3.改進MySdi程序,利用CArchive類,添加串行化存儲和裝入功能; 5.2 5.2 文檔與視圖的概念 5.2.1 5.2.1 文檔文檔5.2.2 5.2.2 視圖視圖 5.2.3 5.2.3 文檔與視圖的關(guān)系文檔與視圖的關(guān)系 5.2.4 5.2.4 文檔與視圖的交互過程文檔與視圖的交互過程 返回目錄返回目錄要點提示: 文檔 返回目錄返回目錄 文檔類繼承于文檔類繼承于CDocumentC

3、Document類類,它描述了應(yīng)用的它描述了應(yīng)用的數(shù)據(jù)。抽象地說,文檔是一個應(yīng)用程序數(shù)據(jù)基本數(shù)據(jù)。抽象地說,文檔是一個應(yīng)用程序數(shù)據(jù)基本元素的集合,它構(gòu)成應(yīng)用程序所使用的數(shù)據(jù)單元,元素的集合,它構(gòu)成應(yīng)用程序所使用的數(shù)據(jù)單元,文檔負責管理和維護應(yīng)用的數(shù)據(jù)。文檔負責管理和維護應(yīng)用的數(shù)據(jù)。 具體一點來說,文檔是一種數(shù)據(jù)源,數(shù)據(jù)源有具體一點來說,文檔是一種數(shù)據(jù)源,數(shù)據(jù)源有很多種,最常見的是磁盤文件,但是文檔不必非很多種,最常見的是磁盤文件,但是文檔不必非要是一個磁盤文件,文檔的數(shù)據(jù)源也可以來自串要是一個磁盤文件,文檔的數(shù)據(jù)源也可以來自串行口或并行口的輸入數(shù)據(jù)。文檔對象負責來自所行口或并行口的輸入數(shù)據(jù)。文

4、檔對象負責來自所有數(shù)據(jù)源的數(shù)據(jù)的管理。有數(shù)據(jù)源的數(shù)據(jù)的管理。 視圖返回目錄返回目錄 視圖類則繼承于視類CView,它是一個基于視類的窗口。 視圖是數(shù)據(jù)的用戶窗口,為用戶提供了文檔的可視的數(shù)據(jù)顯示,它把文檔的部分或全部內(nèi)容在窗口中顯示出來,視圖給用戶提供了一個同文件中的數(shù)據(jù)進行交互的界面,它把用戶的輸入轉(zhuǎn)化為對文檔中數(shù)據(jù)的操作。 文檔與視圖的關(guān)系 返回目錄返回目錄 文檔用來保存數(shù)據(jù),視圖用來顯示數(shù)據(jù),視圖是顯示出的文檔。一個文檔可以有多個不同的視圖。文檔與視圖的關(guān)系,可用下圖來描述。 文檔與視圖的交互過程 返回目錄返回目錄 1 1CViewCView類的類的GetDocumentGetDocum

5、ent()()函數(shù)函數(shù) 視圖類CViewCView的GetDocumentGetDocument()()函數(shù)返回的是一個CDocument或其派生類的指針??捎玫玫降奈臋n指針來訪問文檔中的數(shù)據(jù)。 從而在視圖類中,實現(xiàn)文檔類的數(shù)據(jù)與視圖類的數(shù)據(jù)進行交換。 2. 2. CDocumentCDocument類的類的UpdateAllViewsUpdateAllViews()()函數(shù)函數(shù) 當文檔的數(shù)據(jù)發(fā)生了變化后,文檔也要通知視圖當前的變化,以讓視圖能夠及時更新,忠于文檔的數(shù)據(jù) 。 這 樣 的 一 件 工 作 是 通 過 文 檔 類 中 的UpdateAllViewsUpdateAllViews()(

6、)函數(shù)來實現(xiàn)的。 5.3 5.3 單文檔應(yīng)用程序(SDI) 5.3.1 創(chuàng)建工程 5.3.2 可視化設(shè)計 5.3.3 給文檔類添加成員變量 5.3.4 給視圖類添加成員變量5.3.5 變量初始化 5.3.6 處理數(shù)據(jù)記錄的錄入 5.3.8 技術(shù)要點返回目錄返回目錄要點提示: 創(chuàng)建工程返回目錄返回目錄在創(chuàng)建工程時,應(yīng)注意以下兩點:1. 在“MFC AppWizard-Step 1”對話框中,選擇“Single Document”,創(chuàng)建一個基于單文檔界面的應(yīng)用程序 ;2. 在“MFC AppWizard-Step 6 of 6”對話框,如圖5-5所示。其中顯示MFC AppWizard為應(yīng)用程創(chuàng)建

7、的所有類以及各個類對應(yīng)的基類和相應(yīng)的文件,選取CFormView作為視圖基類(可以在主窗口內(nèi)添加控件),其余接受缺省設(shè)置。選取CFormView作為視圖基類 可視化設(shè)計返回目錄返回目錄 表5-1 對話框IDD_MYSDI_FORM中各控件的屬性表對象屬性屬性值對象屬性屬性值Static TextIDCaptionIDC_STATIC姓名:Edit BoxIDIDC_EDIT_NAMEIDC_STATIC性別:Edit BoxIDIDC_EDIT_SEXIDC_STATIC年齡:Edit BoxIDIDC_EDIT_AGEIDC_STATIC電話: Edit BoxIDIDC_EDIT_TELI

8、DC_STATIC學(xué)號: Combo BoxIDTypeIDC_COMBODropdownIDC_STATIC生源簡介:Edit BoxIDMultilineIDC_EDIT_SCHOOLChecked 表5-1 對話框IDD_MYSDI_FORM中各控件的屬性表 可視化設(shè)計(續(xù))返返 回回 表5-1 對話框IDD_MYSDI_FORM中各控件的屬性表根據(jù)表5-1中的定義編輯對話框資源,設(shè)計完畢對話框如下圖所示。 給文檔類添加成員變量返回目錄返回目錄為了將程序的數(shù)據(jù)存儲到文件中,或者從將文件中的數(shù)據(jù)裝入。換句話說,文擋類中的數(shù)據(jù)就是要操作的對象,我們必須將其定義為文檔類的數(shù)據(jù)成員。class

9、CMySdiDoc : public CDocumentprotected: / create from serialization onlyCMySdiDoc();DECLARE_DYNCREATE(CMySdiDoc) public: structstruct char name10char name10,sex3;sex3;int int age;age;char char teltel1414,school30;school30;m_student40;m_student40; ; 給視圖類添加成員變量返回目錄返回目錄 視圖類是負責屏幕的顯示內(nèi)容。在此,要加入的視圖類數(shù)據(jù)成員實際上就是

10、文檔類的數(shù)據(jù)成員在屏幕上的映射。而將視圖類中的變量顯示在屏幕上最簡捷的方法是:將變量與某編輯控件關(guān)聯(lián),即為IDD_MYSDI_FORM對話框中編輯框引入變量。如下圖5所示。 處理數(shù)據(jù)記錄的錄入1 1添加消息響應(yīng)函數(shù)添加消息響應(yīng)函數(shù) 返回目錄返回目錄 實現(xiàn)數(shù)據(jù)記錄的編輯,就是處理編輯框的EN_CHANGE事件,即 為編輯框的EN_CHANGE事件添加響應(yīng)函數(shù); 在消息響應(yīng)函數(shù)中,編寫將編輯的數(shù)據(jù)傳送給文檔類對應(yīng)的變量控件ID 事件(消息) 消息函數(shù) 說明 IDC_COMBO CBN_SELCHANGE OnSelchangeCombo 選擇學(xué)號的組合框 IDC_EDIT_NAME EN_CHAN

11、GE OnChangeEditName 編輯與顯示姓名 IDC_AGE EN_CHANGEOnChangeEditAge 編輯與顯示年齡 IDC_EDIT_SCHOOLEN_CHANGEOnChangeEditSchool 編輯與顯示原畢學(xué)校 IDC_EDIT_SEX EN_CHANGEOnChangeEditSex編輯與顯示性別IDC_EDIT_TEL EN_CHANGEOnChangeEditTel編輯與顯示電話號碼 處理數(shù)據(jù)記錄的錄入(續(xù)一)2. 為為OnChangeEditNameOnChangeEditName函數(shù)函數(shù)編寫程序代碼編寫程序代碼返返 回回void CMySdiView:

12、OnChangeEditName() CMySdiDoc *pDoc = GetDocument();/獲取指向文檔類對象指針 UpdateData(true);/用控件的值去更新與之關(guān)聯(lián)變量 if(strcmp( pDoc-m_studentm_nCurrentN,m_name) strcpy( pDoc-m_studentm_nCurrentN,m_name); pDoc-SetModifiedFlag();/設(shè)置數(shù)據(jù)修改標志 處理數(shù)據(jù)記錄的錄入(續(xù)二)3. 為為OnChangeEditAge函數(shù)函數(shù)編寫程序代碼編寫程序代碼返返 回回void CMySdiView:

13、OnChangeEditAge() CMySdiDoc *pDoc = GetDocument();UpdateData(true);if( pDoc-m_studentm_nCurrentNo.age != m_age) pDoc-m_studentm_nCurrentNo.age=m_age; pDoc-SetModifiedFlag(); 處理數(shù)據(jù)記錄的錄入(續(xù)三)4. 為為OnChangeEditSchool函數(shù)函數(shù)編寫程序代碼編寫程序代碼返返 回回void CMySdiView:OnChangeEditSchool() CMySdiDoc *pDoc = GetDocument();

14、 UpdateData(true); if(strcmp( pDoc-m_studentm_nCurrentNo.school,m_school) strcpy( pDoc-m_studentm_nCurrentNo.school,m_school); pDoc-SetModifiedFlag(); 處理數(shù)據(jù)記錄的錄入(續(xù)四)5. 為為OnChangeEditSex函數(shù)函數(shù)編寫程序代碼編寫程序代碼返返 回回void CMySdiView:OnChangeEditSex() CMySdiDoc *pDoc = GetDocument();UpdateData(true);if(strcmp( p

15、Doc-m_studentm_nCurrentNo.sex,m_sex) strcpy( pDoc-m_studentm_nCurrentNo.sex,m_sex); pDoc-SetModifiedFlag(); 處理數(shù)據(jù)記錄的錄入(續(xù)五)6. 為為OnChangeEditTel函數(shù)函數(shù)編寫程序代碼編寫程序代碼返返 回回void CMySdiView:OnChangeEditTel() CMySdiDoc *pDoc = GetDocument();UpdateData(true);if(strcmp( pDoc-m_studentm_nCurrentNo.tel,m_tel) strcpy

16、( pDoc-m_studentm_nCurrentNo.tel,m_tel); pDoc-SetModifiedFlag(); 處理數(shù)據(jù)記錄的錄入(續(xù)六)7. 為為OnSelchangeCombo函數(shù)函數(shù)編寫程序代碼編寫程序代碼返返 回回void CMySdiView:OnSelchangeCombo() CMySdiDoc *pDoc = GetDocument();m_nCurrentNo = m_noList.GetCurSel();m_name = pDoc-m_studentm_nCurrentN;m_age = pDoc-m_studentm_nCurrentNo.a

17、ge;m_school=pDoc-m_studentm_nCurrentNo.school;m_sex =pDoc-m_studentm_nCurrentNo.sex;m_tel =pDoc-m_studentm_nCurrentNo.tel;UpdateData(false); 處理數(shù)據(jù)記錄的錄入(續(xù)六)7. 為為OnSelchangeCombo函數(shù)函數(shù)編寫程序代碼編寫程序代碼返返 回回void CMySdiView:OnSelchangeCombo() CMySdiDoc *pDoc = GetDocument();m_nCurrentNo = m_noList.GetCurSel();m

18、_name = pDoc-m_studentm_nCurrentN;m_age = pDoc-m_studentm_nCurrentNo.age;m_school=pDoc-m_studentm_nCurrentNo.school;m_sex =pDoc-m_studentm_nCurrentNo.sex;m_tel =pDoc-m_studentm_nCurrentNo.tel;UpdateData(false); 技術(shù)要點技術(shù)要點組合框組合框返回目錄返回目錄 組合框可以看作是一個編輯框或靜態(tài)文本框與一個列表框組合。當組合框可以看作是一個編輯框或靜態(tài)文本框與一個列表框組合。當前選

19、定的項將顯示在組合框的編輯框或靜態(tài)文本框中,如果組合框具有下前選定的項將顯示在組合框的編輯框或靜態(tài)文本框中,如果組合框具有下拉列表(拉列表(drop-down listdrop-down list)樣式,則用戶可以在編輯框架中鍵入列表框中樣式,則用戶可以在編輯框架中鍵入列表框中某一項的首字母,在列表框可見時,與該字母相匹配的最近的項將被加亮某一項的首字母,在列表框可見時,與該字母相匹配的最近的項將被加亮顯示。顯示。Combo BoxCombo Box控件與控件與CComboBoxCComboBox類關(guān)聯(lián)。類關(guān)聯(lián)。CComboBoxCComboBox類常見的成員函數(shù)類常見的成員函數(shù)如下表所示。如

20、下表所示。 函 數(shù)說 明GetCount獲得組合框中列表框項的數(shù)目GetCurSel返回組合框中列表框的當前選定項的索引SetCurSel設(shè)置組合框中列表框的一個字符串DeleteString從組合框的列表框中刪除一個字符串InsertString向組合框的列表框中插入一個字符串AddString向組合框的列表框中添加一個字符串SelectString在組合框的列表框中查找字符串,如果找到,在列表框中選擇該字符串,并復(fù)制到編輯框控件中 5.45.4文檔的存儲和裝入文檔的存儲和裝入 5.4.1 5.4.1 利用利用CFileCFile類操作文件類操作文件 5.4.2 5.4.2 工具欄的可視化設(shè)

21、計工具欄的可視化設(shè)計( (略略) ) 5.4.3 5.4.3 為為“打開打開”按鈕編寫代碼按鈕編寫代碼 5.4.4 5.4.4 為為“另存為另存為”按鈕編寫代按鈕編寫代碼碼返回目錄返回目錄要點提示: 利用利用CFileCFile類操作文件類操作文件知識要點:知識要點: 返回目錄返回目錄利用CFile類操作文件的步驟如下: 創(chuàng)建CFile類對象: CFile f; 打開文件: f.Open() 讀/寫文件: f.Read()/f.Write() 關(guān)閉文件: f.close() CFileCFile類介紹類介紹返回目錄返回目錄 CFile是MFC文件類的基類,它直接提供二進制文件的輸入/輸出操作,

22、并通過派生類支持文本文件和內(nèi)存文件。該類與其派生類的層次關(guān)系讓程序通過各種CFile接口使各種文件操作一致化。不論是內(nèi)存文件、磁盤文件、二進制文件,還是文本文件都可以使用幾乎相同的函數(shù)來操作,使程序更簡單。CFile類的主要成員函數(shù)如下表所示。 成員函數(shù) 功 能 成員函數(shù) 功 能 Open打開磁盤文件 Read從打開的文件中讀取數(shù)據(jù)Close關(guān)閉打開的文件Write將數(shù)據(jù)存儲在打開的文件中Seek文件指針定位 GetLength 獲取文件長度信息Remove刪除指定的文件Rename 更改指定文件名 SetStatus設(shè)置文件狀態(tài)信息 GetStatus獲取文件狀態(tài)信息 文件打開文件打開/ /

23、關(guān)閉(關(guān)閉(Open/Close)Open/Close) 返返 回回1. 1. CFileCFile類一般通過成員函數(shù)類一般通過成員函數(shù)OpenOpen來打開文件來打開文件 BOOL Open(LPCTSTR lpzsFileName,UINT nOpenFlag); 其中:lpzsFileName:為欲打開的文件名,可包含路經(jīng)名;nOpenFlag: 用于設(shè)置訪問模式,例如:Cfile f;f.Open(“D:My.TXT”, CFile:modeRead);表示以讀方式打開“D:My.TXT”文件。2. 2. 關(guān)閉文件函數(shù)關(guān)閉文件函數(shù)CloseClose Close()函數(shù)用于關(guān)閉由Ope

24、n()函數(shù)打開的文件。例如 f.Close(); 文件的讀寫文件的讀寫( (Read/Write)Read/Write)返返 回回1. CFile類提供了Read()函數(shù)用于讀入文件 UINT Read(void *lpBuf,UINT nCount) Read()函數(shù)返回值是傳輸?shù)骄彌_區(qū)的字節(jié)數(shù)。2. CFile類提供了Write()函數(shù)用于寫入文件 void Write(void *lpBuf,UINT nCount) ; Write()函數(shù)的參數(shù)與Read()函數(shù)的參數(shù)類似。 文件的讀寫文件的讀寫( (Read/Write)Read/Write)返返 回回1. CFile類提供了Read

25、()函數(shù)用于讀入文件 UINT Read(void *lpBuf,UINT nCount) Read()函數(shù)返回值是傳輸?shù)骄彌_區(qū)的字節(jié)數(shù)。2. CFile類提供了Write()函數(shù)用于寫入文件 void Write(void *lpBuf,UINT nCount) ; Write()函數(shù)的參數(shù)與Read()函數(shù)的參數(shù)類似。 文件操作舉例文件操作舉例文件復(fù)制文件復(fù)制返回目錄返回目錄void MyCopy(CString strSource, CString strTarget) CFile fs, ft; STUDENT s; int nCount; if( !fs.Open(strSource

26、, CFile:modeRead) ) MessageBox(“Open Source File Fail !”);return; if( !ft.Open(strTarget, CFile:modeRead) ) MessageBox(“Open File Fail !”);fs.Close();return; nCount = fs.Read(&s, sizeof(STUDENT); while( nCount ) ft.Write(&s, sizeof(STUDENT); nCount = fs.Read(&s, sizeof(STUDENT); fs.Close(); ft.Close

27、(); 為為“打開打開”按鈕編寫代按鈕編寫代碼碼返回目錄返回目錄void CMySdiView:OnFileMyopen() CString strFilter = Dat Files (*.dat)|*.dat|All Files (*.*)|*.*|; /啟動通用文件對話框,選擇文件名CFileDialog FileDlg(true, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(LPCSTR)strFilter, this);if (FileDlg.DoModal() != IDOK)return;CString strFileNam

28、e = FileDlg.GetPathName();/打開文件 CFile f; if(!f.Open(strFileName,CFile:modeRead)AfxMessageBox(打開文件失敗);return; (轉(zhuǎn)下頁) 為為“打開打開”按鈕編寫代碼按鈕編寫代碼( (續(xù)續(xù)) )返返 回回/讀出文件中的數(shù)據(jù),存放到文檔類的數(shù)據(jù)成員中 CMySdiDoc *pDoc = GetDocument(); f.Read(&m_nCurrentNo,sizeof(int);for(int i=0;im_,10);f.Read(pDoc-m_studenti.sex,3);

29、f.Read(&(pDoc-m_studenti.age),sizeof(int);f.Read(pDoc-m_studenti.tel,14);f.Read(pDoc-m_studenti.school,50); f.Close();/將文檔類的數(shù)據(jù)傳遞給視類數(shù)據(jù)成員,并顯示m_noList.SetCurSel(m_nCurrentNo); m_name = pDoc-m_studentm_nCurrentN;m_age = pDoc-m_studentm_nCurrentNo.age;m_school=pDoc-m_studentm_nCurrentNo.school;m_se

30、x =pDoc-m_studentm_nCurrentNo.sex;m_tel =pDoc-m_studentm_nCurrentNo.tel; UpdateData(false); (接上頁)void CMySdiView:OnFileMysave() CFileDialog FileDlg(false, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(LPCSTR)strFilter, this);if (FileDlg.DoModal() != IDOK)return; 啟動通用文件對話框CString strFileName = Fi

31、leDlg.GetPathName();CFile f; /打開文件f.Open(strFileName,CFile:modeCreate|CFile:modeWrite); CMySdiDoc *pDoc = GetDocument(); /寫文件,存儲數(shù)據(jù)f.Write(&m_nCurrentNo,sizeof(int);for(int i=0;im_,10);f.Write(pDoc-m_studenti.sex,3);f.Write(&(pDoc-m_studenti.age),sizeof(int);f.Write(pDoc-m_studenti.tel,14);f.Write(pDoc-m_studenti.school,50);f.Close();/關(guān)閉文件 為為“另存為另存為”按鈕編寫代按鈕編寫代碼碼返返 回回 5.5 5.5 添加串行化功能添加串行化功能返回目錄返回目錄5.5.1 5.5.1 串行化概述串行化概述 5.5.2 5.5.2 添加串行化存儲和裝入添加串行化存儲和裝入 練練 習(xí)習(xí) 要點提示: 串行化概述串行化概述返回目錄返回目錄 一個對象通過某個操作,在程序退出時可被存儲,當程序啟動時又可被恢復(fù)。對象的這種存儲和恢復(fù)處理過程稱為“串行化” 。 串行化的基本思想是一個類對象能夠?qū)⑺涗浽诔蓡T變量中的當前

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論