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

下載本文檔

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

文檔簡(jiǎn)介

1、第第7 7章章 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu) 定制程序框架,張揚(yáng)應(yīng)用程序個(gè)性定制程序框架,張揚(yáng)應(yīng)用程序個(gè)性教學(xué)內(nèi)容教學(xué)內(nèi)容7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)7.2 7.2 文檔視圖結(jié)構(gòu)的主要組成類文檔視圖結(jié)構(gòu)的主要組成類7.3 7.3 多視圖及窗口切分多視圖及窗口切分7.4 7.4 文件操作文件操作7.5 7.5 綜合實(shí)例綜合實(shí)例賓館管理系統(tǒng)的完善賓館管理系統(tǒng)的完善7.6 7.6 小結(jié)小結(jié) 思考與練習(xí)思考與練習(xí)7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu) 7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)在文檔視圖結(jié)構(gòu)中,文檔、框架窗口與視圖通過文檔模板聯(lián)系在一起。文檔在文檔視圖結(jié)構(gòu)中,文檔、框架窗口與視

2、圖通過文檔模板聯(lián)系在一起。文檔模板負(fù)責(zé)在運(yùn)行時(shí)創(chuàng)建(動(dòng)態(tài)創(chuàng)建)文檔、視圖和框架窗口。一個(gè)應(yīng)用程序模板負(fù)責(zé)在運(yùn)行時(shí)創(chuàng)建(動(dòng)態(tài)創(chuàng)建)文檔、視圖和框架窗口。一個(gè)應(yīng)用程序?qū)ο罂梢怨芾硪粋€(gè)或多個(gè)文檔模板,每個(gè)文檔模板用于動(dòng)態(tài)創(chuàng)建和管理一個(gè)對(duì)象可以管理一個(gè)或多個(gè)文檔模板,每個(gè)文檔模板用于動(dòng)態(tài)創(chuàng)建和管理一個(gè)或多個(gè)同類型的文檔(這取決于應(yīng)用程序是或多個(gè)同類型的文檔(這取決于應(yīng)用程序是SDI程序還是程序還是MDI程序)。程序)。MFC的文檔模板類的文檔模板類CDocTemplate用于支持文檔模板操作。由于文檔模板類是一個(gè)用于支持文檔模板操作。由于文檔模板類是一個(gè)抽象基類,因此不能直接用其聲明對(duì)象,只能使用其派

3、生類。對(duì)于單文檔界抽象基類,因此不能直接用其聲明對(duì)象,只能使用其派生類。對(duì)于單文檔界面程序,應(yīng)使用面程序,應(yīng)使用CSingleDocTemplate(單文檔模板類),對(duì)于一個(gè)多文檔界(單文檔模板類),對(duì)于一個(gè)多文檔界面程序,使用面程序,使用CMultipleDocTemplate(多文檔模板類)。(多文檔模板類)。 7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)1、文檔類的成員函數(shù)、文檔類的成員函數(shù) 獲得視圖列表中與本文檔關(guān)聯(lián)的第一個(gè)視圖的位置函數(shù):獲得視圖列表中與本文檔關(guān)聯(lián)的第一個(gè)視圖的位置函數(shù): virtual POSITION GetFirstViewPosition( ) const; 獲得

4、下一個(gè)本文檔關(guān)聯(lián)的視圖的位置到獲得下一個(gè)本文檔關(guān)聯(lián)的視圖的位置到rPosition中:中:virtual CView* GetNextView( POSITION& rPosition ) const;顯然,使用顯然,使用GetFirstViewPosition與與GetNextView可遍歷文檔的所有可遍歷文檔的所有視圖。視圖。 返回文檔返回文檔(窗口窗口)的標(biāo)題,一般為相關(guān)聯(lián)的文件名的標(biāo)題,一般為相關(guān)聯(lián)的文件名const CString& GetTitle( ) const; 設(shè)置文檔設(shè)置文檔(窗口窗口)的標(biāo)題的標(biāo)題virtual void SetTitle( LPCTST

5、R lpszTitle ); 返回與文檔相關(guān)聯(lián)的文件的路徑,無關(guān)聯(lián)文件時(shí)返回返回與文檔相關(guān)聯(lián)的文件的路徑,無關(guān)聯(lián)文件時(shí)返回NULLconst CString& GetPathName( ) const; 7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)1、文檔類的成員函數(shù)、文檔類的成員函數(shù) 設(shè)置存取文檔的默認(rèn)路徑(與文檔設(shè)置存取文檔的默認(rèn)路徑(與文檔(窗口窗口)的標(biāo)題)的標(biāo)題)virtual void SetPathName( LPCTSTR lpszPathName, BOOL bAddToMRU = TRUE ); 判斷文檔在最后一次存儲(chǔ)后是否被修改過,判斷文檔在最后一次存儲(chǔ)后是否被修改過

6、, 若被修改過,則在用戶關(guān)閉若被修改過,則在用戶關(guān)閉文檔窗口或應(yīng)用程序時(shí),會(huì)提示保存文件文檔窗口或應(yīng)用程序時(shí),會(huì)提示保存文件BOOL IsModified( ); 設(shè)置文檔在最后一次存儲(chǔ)后是否被修改過設(shè)置文檔在最后一次存儲(chǔ)后是否被修改過void SetModifiedFlag( BOOL bModified = TRUE ); 更新所有視圖更新所有視圖void UpdateAllViews( CView* pSender, LPARAM lHint , CObject* pHint ); 7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)2、文檔的序列化、文檔的序列化用戶處理的數(shù)據(jù)往往需要存盤作永久備份

7、。將文檔類中的數(shù)據(jù)成員變量的值用戶處理的數(shù)據(jù)往往需要存盤作永久備份。將文檔類中的數(shù)據(jù)成員變量的值保存在磁盤文件中,或者將存儲(chǔ)的文檔文件中的數(shù)據(jù)讀取到相應(yīng)的成員變量保存在磁盤文件中,或者將存儲(chǔ)的文檔文件中的數(shù)據(jù)讀取到相應(yīng)的成員變量中。這個(gè)過程稱為序列化中。這個(gè)過程稱為序列化(Serialize)。序列化實(shí)質(zhì)上就是讓對(duì)象將其當(dāng)前。序列化實(shí)質(zhì)上就是讓對(duì)象將其當(dāng)前的狀態(tài)(由其成員變量的值表示)寫入到永久性存儲(chǔ)體(通常是指磁盤)中,的狀態(tài)(由其成員變量的值表示)寫入到永久性存儲(chǔ)體(通常是指磁盤)中,以后還可以從永久性存儲(chǔ)體中讀取對(duì)象的狀態(tài)(載入),從而重建對(duì)象。這以后還可以從永久性存儲(chǔ)體中讀取對(duì)象的狀態(tài)

8、(載入),從而重建對(duì)象。這種對(duì)象的保存和恢復(fù)的過程稱為種對(duì)象的保存和恢復(fù)的過程稱為 “序列化序列化”。序列化是一種實(shí)現(xiàn)對(duì)象持久性。序列化是一種實(shí)現(xiàn)對(duì)象持久性(Persistent)的機(jī)制,它是一個(gè)將對(duì)象中的數(shù)據(jù)轉(zhuǎn)換成一個(gè)單一元素)的機(jī)制,它是一個(gè)將對(duì)象中的數(shù)據(jù)轉(zhuǎn)換成一個(gè)單一元素(通常是(通常是Stream)的過程。)的過程。7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)2、文檔的序列化、文檔的序列化用戶單擊菜單項(xiàng)“文件保存”用戶單擊菜單項(xiàng)“文件另存為”打開當(dāng)前文檔所對(duì)應(yīng)的文件詢問保存文件名生成Carchive的一個(gè)對(duì)象,并使之與所保存的文件相關(guān)聯(lián)打開用戶輸入的文件調(diào)用文檔類的Serialize成員函

9、數(shù),并將生成的Carchive對(duì)象傳遞給該成員函數(shù)Serialize成員函數(shù)通過CArchive對(duì)象將當(dāng)前文檔的數(shù)據(jù)保存到指定的介質(zhì)(通常是磁盤文件)中7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu) 7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)1、CView類類CView是用戶視圖類的缺省基類,也是其他各種是用戶視圖類的缺省基類,也是其他各種MFC視圖類的基類。視圖視圖類的基類。視圖類類CView是窗口類是窗口類CWnd類的派生類。視圖類對(duì)象完全覆蓋框架窗口的用類的派生類。視圖類對(duì)象完全覆蓋框架窗口的用戶區(qū),沒有自己的邊框。視圖規(guī)定了用戶查看文檔數(shù)據(jù)以及同數(shù)據(jù)交互的方戶區(qū),沒有自己的邊框。視圖規(guī)定了用戶

10、查看文檔數(shù)據(jù)以及同數(shù)據(jù)交互的方式。式。視圖類有幾個(gè)重要的成員函數(shù)。視圖類有幾個(gè)重要的成員函數(shù)。GetDocument()成員函數(shù)用于從文檔類中獲取數(shù)據(jù)值。實(shí)際上,該函()成員函數(shù)用于從文檔類中獲取數(shù)據(jù)值。實(shí)際上,該函數(shù)提供一個(gè)指向文檔派生類對(duì)象的指針,通過該指針可訪問文檔派生類的公數(shù)提供一個(gè)指向文檔派生類對(duì)象的指針,通過該指針可訪問文檔派生類的公有成員。例如:有成員。例如:GetDocument ( ) AddBubble ( rectBubble );正因?yàn)槿绱?,文檔類的數(shù)據(jù)成員只能聲明為公有的,而不能象面向?qū)ο蠹夹g(shù)正因?yàn)槿绱耍臋n類的數(shù)據(jù)成員只能聲明為公有的,而不能象面向?qū)ο蠹夹g(shù)所要求的那

11、樣,將所有的數(shù)據(jù)成員均聲明為私有成員。由于文檔類和視圖類所要求的那樣,將所有的數(shù)據(jù)成員均聲明為私有成員。由于文檔類和視圖類的關(guān)系十分密切,這樣做可以簡(jiǎn)化程序設(shè)計(jì),并不會(huì)因封裝性被破壞而造成的關(guān)系十分密切,這樣做可以簡(jiǎn)化程序設(shè)計(jì),并不會(huì)因封裝性被破壞而造成混亂。混亂。在視圖類中,用在視圖類中,用OnDraw()成員函數(shù)更新視圖,其用法類似窗口類的()成員函數(shù)更新視圖,其用法類似窗口類的OnPaint()函數(shù)。所不同的是,()函數(shù)。所不同的是,OnDraw()函數(shù)有一個(gè)指向()函數(shù)有一個(gè)指向CDC類的類的指針參數(shù),通過該參數(shù)可以直接向視圖輸出。指針參數(shù),通過該參數(shù)可以直接向視圖輸出。7.1 7.1

12、 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)2、 CEditView類類CEditView類對(duì)象是一種視圖,像類對(duì)象是一種視圖,像CEdit類一樣,它也提供窗口編輯控制類一樣,它也提供窗口編輯控制功能,可以用來執(zhí)行簡(jiǎn)單文本操作,如打印、查找、替換、剪貼板的剪切、功能,可以用來執(zhí)行簡(jiǎn)單文本操作,如打印、查找、替換、剪貼板的剪切、復(fù)制和粘貼等。由于復(fù)制和粘貼等。由于CEditView類自動(dòng)封裝上述功能的映射函數(shù),因此只類自動(dòng)封裝上述功能的映射函數(shù),因此只要在文檔模板中使用要在文檔模板中使用CEditView類,那么應(yīng)用程序的類,那么應(yīng)用程序的“編輯編輯”菜單和菜單和“文文件件”菜單里的菜單項(xiàng)都可自動(dòng)激活。菜單里的菜

13、單項(xiàng)都可自動(dòng)激活。3、 CRichEditView類類CRichEditView類使用了復(fù)合文本編輯控件,因此它支持混合字體格式和類使用了復(fù)合文本編輯控件,因此它支持混合字體格式和更大數(shù)據(jù)量的文本。更大數(shù)據(jù)量的文本。CRichEditView類被設(shè)計(jì)成與類被設(shè)計(jì)成與CRichEditDoc和和CRichEditCntrItem類一起使用,它們可實(shí)現(xiàn)一個(gè)完整的類一起使用,它們可實(shí)現(xiàn)一個(gè)完整的ActiveX包容包容器應(yīng)用程序。器應(yīng)用程序。4、CFormView類類CFormView類是一個(gè)非常有用的視圖類,它具有許多無模式對(duì)話框的特點(diǎn)。類是一個(gè)非常有用的視圖類,它具有許多無模式對(duì)話框的特點(diǎn)。像像C

14、Dialog的派生類一樣,的派生類一樣,CFormView的派生類也和相應(yīng)的對(duì)話框資源的派生類也和相應(yīng)的對(duì)話框資源相聯(lián)系,它也支持對(duì)話框數(shù)據(jù)交換和對(duì)話框數(shù)據(jù)確認(rèn)相聯(lián)系,它也支持對(duì)話框數(shù)據(jù)交換和對(duì)話框數(shù)據(jù)確認(rèn)(DDX和和DDV)。7.1 7.1 文檔視圖結(jié)構(gòu)文檔視圖結(jié)構(gòu)5、CHtmlView 類類CHtmlView 類是在文檔視圖結(jié)構(gòu)中提供類是在文檔視圖結(jié)構(gòu)中提供WebBrowser控件控件的功能。的功能。WebBrowser控件可以瀏覽網(wǎng)址,也可以作為本地控件可以瀏覽網(wǎng)址,也可以作為本地文件和網(wǎng)絡(luò)文件系統(tǒng)的窗口,它支持超級(jí)鏈接、統(tǒng)一資源定位文件和網(wǎng)絡(luò)文件系統(tǒng)的窗口,它支持超級(jí)鏈接、統(tǒng)一資源定位

15、(URL)導(dǎo)航器并維護(hù)歷史列表等。導(dǎo)航器并維護(hù)歷史列表等。6、CScrollView類類CScrollView類不僅能直接支持視圖的滾動(dòng)操作,而且還能管類不僅能直接支持視圖的滾動(dòng)操作,而且還能管理視口的大小和映射模式,并能響應(yīng)滾動(dòng)條消息、鍵盤消息以理視口的大小和映射模式,并能響應(yīng)滾動(dòng)條消息、鍵盤消息以及鼠標(biāo)滾輪消息。及鼠標(biāo)滾輪消息。7.2 7.2 文檔視圖結(jié)構(gòu)的主要組成類文檔視圖結(jié)構(gòu)的主要組成類1、示例程序的創(chuàng)建、示例程序的創(chuàng)建2、單文檔應(yīng)用程序的組成類、單文檔應(yīng)用程序的組成類向?qū)傻囊粋€(gè)典型的單文檔應(yīng)用程序包括一個(gè)應(yīng)用程序類向?qū)傻囊粋€(gè)典型的單文檔應(yīng)用程序包括一個(gè)應(yīng)用程序類CMyEdit

16、orApp、一個(gè)主框架窗口類一個(gè)主框架窗口類CMainFrame、一個(gè)文檔類、一個(gè)文檔類CMyEditorDoc、一個(gè)視圖類、一個(gè)視圖類CMyEditorView、一個(gè)、一個(gè)“關(guān)于關(guān)于”對(duì)話框類對(duì)話框類CAboutDlg。 7.2 7.2 文檔視圖結(jié)構(gòu)的主要組成類文檔視圖結(jié)構(gòu)的主要組成類1、示例程序的創(chuàng)建、示例程序的創(chuàng)建2、多文檔應(yīng)用程序的組成類、多文檔應(yīng)用程序的組成類向?qū)傻囊粋€(gè)典型的多文檔應(yīng)用程序包括一個(gè)應(yīng)用程序類向?qū)傻囊粋€(gè)典型的多文檔應(yīng)用程序包括一個(gè)應(yīng)用程序類CMyWordApp、一個(gè)主框架窗口類、一個(gè)主框架窗口類CMainFrame、一個(gè)子框架、一個(gè)子框架窗口類窗口類CChild

17、Frame、一個(gè)文檔類、一個(gè)文檔類CMyWordDoc、一個(gè)視圖類、一個(gè)視圖類CMyWordView、一個(gè)、一個(gè)“關(guān)于關(guān)于”對(duì)話框類對(duì)話框類CAboutDlg。由于該程。由于該程序可以是復(fù)合文檔的容器,即該程序可以嵌入別的應(yīng)用程序?qū)π蚩梢允菑?fù)合文檔的容器,即該程序可以嵌入別的應(yīng)用程序?qū)ο?,故該類中還有一個(gè)豐富文本條目類象,故該類中還有一個(gè)豐富文本條目類CMyWordCntrItem。7.2 7.2 文檔視圖結(jié)構(gòu)的主要組成類文檔視圖結(jié)構(gòu)的主要組成類 7.2 7.2 文檔視圖結(jié)構(gòu)的主要組成類文檔視圖結(jié)構(gòu)的主要組成類1、文檔視圖結(jié)構(gòu)中各個(gè)對(duì)象之間的關(guān)系、文檔視圖結(jié)構(gòu)中各個(gè)對(duì)象之間的關(guān)系 創(chuàng)建創(chuàng)建創(chuàng)建

18、應(yīng)用程序?qū)ο笾赶颍何臋n模板指向:創(chuàng)建文檔對(duì)象指向:框架窗口指向:視圖對(duì)象指向:7.2 7.2 文檔視圖結(jié)構(gòu)的主要組成類文檔視圖結(jié)構(gòu)的主要組成類1、文檔視圖結(jié)構(gòu)中各個(gè)對(duì)象之間的關(guān)系、文檔視圖結(jié)構(gòu)中各個(gè)對(duì)象之間的關(guān)系 應(yīng)用程序?qū)ο笾赶颍褐骺蚣艽翱趯?duì)象指向:多文檔模板對(duì)象指向:文檔對(duì)象指向:視圖對(duì)象指向:子框架窗口對(duì)象指向:創(chuàng)建創(chuàng)建創(chuàng)建創(chuàng)建父窗口子窗口7.2 7.2 文檔視圖結(jié)構(gòu)的主要組成類文檔視圖結(jié)構(gòu)的主要組成類2、文檔視圖結(jié)構(gòu)中各對(duì)象之間的通信、文檔視圖結(jié)構(gòu)中各對(duì)象之間的通信(1)獲取應(yīng)用程序類對(duì)象的指針)獲取應(yīng)用程序類對(duì)象的指針獲取應(yīng)用程序類對(duì)象的指針可以使用全局函數(shù)獲取應(yīng)用程序類對(duì)象的指針可

19、以使用全局函數(shù)AfxGetApp(),這個(gè)函數(shù)的原型如(),這個(gè)函數(shù)的原型如下:下:CWinApp * AfxGetApp();這個(gè)全局函數(shù)可以在任何需要的時(shí)候使用,函數(shù)的返回值是指向應(yīng)用程序基類這個(gè)全局函數(shù)可以在任何需要的時(shí)候使用,函數(shù)的返回值是指向應(yīng)用程序基類CWinApp的指針。的指針。(2)獲取主框架窗口類對(duì)象的指針)獲取主框架窗口類對(duì)象的指針獲取主框架窗口類對(duì)象的指針可以使用全局函數(shù)獲取主框架窗口類對(duì)象的指針可以使用全局函數(shù)AfxGetMainWnd( )獲取主窗口獲取主窗口對(duì)象的指針,函數(shù)的原型如下:對(duì)象的指針,函數(shù)的原型如下:CWnd *AfxGetMainWnd( );(3)從

20、文檔類中獲取視圖對(duì)象指針)從文檔類中獲取視圖對(duì)象指針在文檔類中有一個(gè)與其關(guān)聯(lián)的各視圖對(duì)象的列表,并可通過在文檔類中有一個(gè)與其關(guān)聯(lián)的各視圖對(duì)象的列表,并可通過CDocument類的成員類的成員函數(shù)函數(shù)GetFirstViewPosition和和GetNextView來定位相應(yīng)的視圖對(duì)象。來定位相應(yīng)的視圖對(duì)象。GetFirstViewPosition函數(shù)用來獲得與文檔類相關(guān)聯(lián)的視圖列表中第一個(gè)可見視函數(shù)用來獲得與文檔類相關(guān)聯(lián)的視圖列表中第一個(gè)可見視圖的位置,圖的位置,GetNextView函數(shù)用來獲取指定視圖位置的視圖類指針,并將此視圖函數(shù)用來獲取指定視圖位置的視圖類指針,并將此視圖位置移動(dòng)到下一

21、個(gè)位置,若沒有下一個(gè)視圖,則視圖位置為位置移動(dòng)到下一個(gè)位置,若沒有下一個(gè)視圖,則視圖位置為NULL。它們的原型如下:。它們的原型如下:virtual POSITION GetFirstViewPosition( ) const;virtual CView* GetNextView( POSITION& rPosition ) const; 7.3 7.3 多視圖及窗口切分多視圖及窗口切分MFC支持在同一文檔上使用多個(gè)視圖的支持在同一文檔上使用多個(gè)視圖的3種通用模式,這些模式是:種通用模式,這些模式是:(1) 在各自在各自MDI文檔窗口中包含同一個(gè)視圖類的多個(gè)視圖對(duì)象。用戶有時(shí)文檔窗口中

22、包含同一個(gè)視圖類的多個(gè)視圖對(duì)象。用戶有時(shí)需要應(yīng)用程序能為同一個(gè)文檔打開另一個(gè)文檔窗口,以便能同時(shí)使用兩個(gè)文需要應(yīng)用程序能為同一個(gè)文檔打開另一個(gè)文檔窗口,以便能同時(shí)使用兩個(gè)文檔窗口來查看文檔的不同部分內(nèi)容。用檔窗口來查看文檔的不同部分內(nèi)容。用MFC AppWizard創(chuàng)建的多文檔應(yīng)創(chuàng)建的多文檔應(yīng)用程序支持這種模式,當(dāng)用戶選擇用程序支持這種模式,當(dāng)用戶選擇“窗口窗口”菜單的菜單的“新建窗口新建窗口”命令時(shí),系命令時(shí),系統(tǒng)就會(huì)為第一個(gè)文檔窗口創(chuàng)建一個(gè)副本。統(tǒng)就會(huì)為第一個(gè)文檔窗口創(chuàng)建一個(gè)副本。(2) 在同一個(gè)文檔窗口中包含同一個(gè)視圖類的多個(gè)視圖對(duì)象。這種模式實(shí)際在同一個(gè)文檔窗口中包含同一個(gè)視圖類的多個(gè)

23、視圖對(duì)象。這種模式實(shí)際上是使用上是使用“切分窗口切分窗口”機(jī)制使機(jī)制使SDI應(yīng)用程序具有多視的特征。應(yīng)用程序具有多視的特征。(3) 在單獨(dú)一個(gè)文檔窗口中包含不同視圖類的多個(gè)視圖對(duì)象。在該模式下,在單獨(dú)一個(gè)文檔窗口中包含不同視圖類的多個(gè)視圖對(duì)象。在該模式下,多個(gè)視圖共享同一個(gè)文檔窗口。它有點(diǎn)象多個(gè)視圖共享同一個(gè)文檔窗口。它有點(diǎn)象“切分窗口切分窗口”,但由于視圖可由不,但由于視圖可由不同的視圖類構(gòu)造,所以同一個(gè)文檔可以有不同的顯示方法。例如,同一個(gè)文同的視圖類構(gòu)造,所以同一個(gè)文檔可以有不同的顯示方法。例如,同一個(gè)文檔可同時(shí)有文字顯示方式及圖形顯示方式的視圖。檔可同時(shí)有文字顯示方式及圖形顯示方式的視

24、圖。7.3 7.3 多視圖及窗口切分多視圖及窗口切分對(duì)于對(duì)于“靜態(tài)切分靜態(tài)切分”窗口來說,當(dāng)窗口第一次被創(chuàng)建時(shí),窗格就已經(jīng)被切分好窗口來說,當(dāng)窗口第一次被創(chuàng)建時(shí),窗格就已經(jīng)被切分好了,窗格的次序和數(shù)目不能再被改變,但用戶可以移動(dòng)切分條來調(diào)整窗格的了,窗格的次序和數(shù)目不能再被改變,但用戶可以移動(dòng)切分條來調(diào)整窗格的大小。每個(gè)窗格通常是不同的視圖類。大小。每個(gè)窗格通常是不同的視圖類。對(duì)于對(duì)于“動(dòng)態(tài)切分動(dòng)態(tài)切分”窗口來說,它允許用戶在任何時(shí)候?qū)Υ翱谶M(jìn)行切分,用戶窗口來說,它允許用戶在任何時(shí)候?qū)Υ翱谶M(jìn)行切分,用戶既可以通過選擇菜單項(xiàng)來對(duì)窗口進(jìn)行切分,也可以通過拖動(dòng)滾動(dòng)條中的切分既可以通過選擇菜單項(xiàng)來對(duì)窗

25、口進(jìn)行切分,也可以通過拖動(dòng)滾動(dòng)條中的切分塊對(duì)窗口進(jìn)行切分。動(dòng)態(tài)切分窗口中的窗格通常使用的是同一個(gè)視圖類。當(dāng)塊對(duì)窗口進(jìn)行切分。動(dòng)態(tài)切分窗口中的窗格通常使用的是同一個(gè)視圖類。當(dāng)切分窗口被創(chuàng)建時(shí),左上窗格通常被初始化成一個(gè)特殊的視圖。當(dāng)視圖沿著切分窗口被創(chuàng)建時(shí),左上窗格通常被初始化成一個(gè)特殊的視圖。當(dāng)視圖沿著某個(gè)方向被切分時(shí),另一個(gè)新添加的視圖對(duì)象被動(dòng)態(tài)創(chuàng)建;當(dāng)視圖沿著兩個(gè)某個(gè)方向被切分時(shí),另一個(gè)新添加的視圖對(duì)象被動(dòng)態(tài)創(chuàng)建;當(dāng)視圖沿著兩個(gè)方向被切分時(shí),新添加的三個(gè)視圖對(duì)象則被動(dòng)態(tài)創(chuàng)建。當(dāng)用戶取消切分時(shí),方向被切分時(shí),新添加的三個(gè)視圖對(duì)象則被動(dòng)態(tài)創(chuàng)建。當(dāng)用戶取消切分時(shí),所有新添加的視圖對(duì)象被刪除,但最

26、先的視圖仍被保留,直到切分窗口本身所有新添加的視圖對(duì)象被刪除,但最先的視圖仍被保留,直到切分窗口本身消失為止。消失為止。7.3 7.3 多視圖及窗口切分多視圖及窗口切分 7.4 7.4 文件操作文件操作1、文件的打開與關(guān)閉、文件的打開與關(guān)閉在在MFC中,使用中,使用CFile打開一個(gè)文件通常使用下列兩個(gè)步驟:打開一個(gè)文件通常使用下列兩個(gè)步驟:(1) 構(gòu)造一個(gè)不帶任何參數(shù)的構(gòu)造一個(gè)不帶任何參數(shù)的CFile對(duì)象;對(duì)象;(2) 調(diào)用成員函數(shù)調(diào)用成員函數(shù)Open并指定文件路徑以及文件標(biāo)志。并指定文件路徑以及文件標(biāo)志。CFile類的類的Open函數(shù)原型如下:函數(shù)原型如下:BOOL Open( LPCTS

27、TR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL ); 參數(shù)參數(shù)lpszFileName為欲打開的文件名,文件名可以包含路徑和文件名為欲打開的文件名,文件名可以包含路徑和文件名兩部分。如兩部分。如“d:baktest.txt”, 如果此字符串不包含文件路徑,如如果此字符串不包含文件路徑,如“test.bak”,則系統(tǒng)默認(rèn)為當(dāng)前路徑,即生成的可執(zhí)行文件所在目錄。,則系統(tǒng)默認(rèn)為當(dāng)前路徑,即生成的可執(zhí)行文件所在目錄。 參數(shù)參數(shù)nOpenFlags用于設(shè)置訪問模式,指定當(dāng)打開文件時(shí)進(jìn)行的動(dòng)作,用于設(shè)置訪問模式,指定當(dāng)打開文件

28、時(shí)進(jìn)行的動(dòng)作,可以將以下所列模式用按位或可以將以下所列模式用按位或“|”操作符連接起來。操作符連接起來。 7.4 7.4 文件操作文件操作2、文件的讀寫、文件的讀寫CFile類支持文件的讀、寫和定位操作。它們相關(guān)函數(shù)的原型如下:類支持文件的讀、寫和定位操作。它們相關(guān)函數(shù)的原型如下: UINT Read( void* lpBuf, UINT nCount );此函數(shù)將文件中指定大小的數(shù)據(jù)讀入指定的緩沖區(qū),并返回向緩沖區(qū)傳輸?shù)拇撕瘮?shù)將文件中指定大小的數(shù)據(jù)讀入指定的緩沖區(qū),并返回向緩沖區(qū)傳輸?shù)淖止?jié)數(shù)。需要說明的是,這個(gè)返回值可能小于字節(jié)數(shù)。需要說明的是,這個(gè)返回值可能小于nCount,這是因?yàn)榭赡艿?/p>

29、達(dá),這是因?yàn)榭赡艿竭_(dá)了文件的結(jié)尾。了文件的結(jié)尾。 void Write( const void* lpBuf, UINT nCount );此函數(shù)將緩沖區(qū)的數(shù)據(jù)寫到文件中。參數(shù)此函數(shù)將緩沖區(qū)的數(shù)據(jù)寫到文件中。參數(shù)lpBuf用來指定要寫到文件中的數(shù)用來指定要寫到文件中的數(shù)據(jù)緩沖區(qū)的指針,據(jù)緩沖區(qū)的指針,nCount表示從數(shù)據(jù)緩沖區(qū)傳送的字節(jié)數(shù)。對(duì)于文本文件,表示從數(shù)據(jù)緩沖區(qū)傳送的字節(jié)數(shù)。對(duì)于文本文件,每行的換行符也被計(jì)算在內(nèi)。每行的換行符也被計(jì)算在內(nèi)。7.4 7.4 文件操作文件操作3、文件的定位、文件的定位CFile可以使程序隨機(jī)讀寫文件,這一隨機(jī)性就是通過文件定位操作來完成可以使程序隨機(jī)讀寫

30、文件,這一隨機(jī)性就是通過文件定位操作來完成的。定位操作用于確定的。定位操作用于確定CFile的讀寫指針,使得程序可以讀寫任意位置的數(shù)的讀寫指針,使得程序可以讀寫任意位置的數(shù)據(jù)。據(jù)。CFile為定位操作提供了下列成員函數(shù)。為定位操作提供了下列成員函數(shù)。(1)CFile:Seek()函數(shù)()函數(shù)CFile:Seek()函數(shù)用于重新定位之前打開的文件讀寫指針,以實(shí)現(xiàn)()函數(shù)用于重新定位之前打開的文件讀寫指針,以實(shí)現(xiàn)隨機(jī)訪問,其函數(shù)原型為:隨機(jī)訪問,其函數(shù)原型為:virtual LONG Seek(LONG lOff, UINT nFrom); throw(CFileException);7.4 7.

31、4 文件操作文件操作3、文件的定位、文件的定位CFile為定位操作提供了下列成員函數(shù)。為定位操作提供了下列成員函數(shù)。(1)CFile:Seek()函數(shù)()函數(shù)CFile:Seek()函數(shù)用于重新定位之前打開的文件讀寫指針,以實(shí)現(xiàn)()函數(shù)用于重新定位之前打開的文件讀寫指針,以實(shí)現(xiàn)隨機(jī)訪問,其函數(shù)原型為:隨機(jī)訪問,其函數(shù)原型為:virtual LONG Seek(LONG lOff, UINT nFrom); (2)CFile:SeekToBegin()函數(shù)()函數(shù)CFile:SeekBegin()函數(shù)用于將文件指針移至文件開頭,函數(shù)原型()函數(shù)用于將文件指針移至文件開頭,函數(shù)原型如下:如下:vo

32、id SeekToBegin( ); throw(CFileException);(3)CFile:SeekToEnd()函數(shù)函數(shù)CFile:SeekToEnd()函數(shù)將文件指針指向文件邏輯尾部。函數(shù)原型如下:函數(shù)將文件指針指向文件邏輯尾部。函數(shù)原型如下:DWORD SeekToEnd( ); throw( CFileException );7.4 7.4 文件操作文件操作4、文件管理操作、文件管理操作對(duì)文件的操作,除了打開文件并進(jìn)行讀寫外以外,還可以進(jìn)行刪除、重命名等操作。對(duì)文件的操作,除了打開文件并進(jìn)行讀寫外以外,還可以進(jìn)行刪除、重命名等操作。CFile類也為這些操作提供了支持。類也為這些

33、操作提供了支持。(1)CFile: GetLength()函數(shù)函數(shù)CFile: GetLength()函數(shù)獲取文件的長(zhǎng)度,函數(shù)原型如下:函數(shù)獲取文件的長(zhǎng)度,函數(shù)原型如下:virtual DWORD GetLength() const; throws (CFileException); 該函數(shù)沒有參數(shù),直接返回文件以字節(jié)計(jì)的長(zhǎng)度。該函數(shù)沒有參數(shù),直接返回文件以字節(jié)計(jì)的長(zhǎng)度。 (2)CFile:GetFileName()函數(shù)()函數(shù)CFile:GetFileName()函數(shù)用于獲取文件名。例如,當(dāng)打開了文件()函數(shù)用于獲取文件名。例如,當(dāng)打開了文件c:aabb.dat,調(diào)用,調(diào)用GetFileNa

34、me()就可以獲得該文件的名字()就可以獲得該文件的名字bb.dat。其原。其原型為型為virtual CString GetFileName()() const;函數(shù)返回值即為指定文件的名稱。函數(shù)返回值即為指定文件的名稱。(3)CFile:GetFileTitle()函數(shù)()函數(shù)CFile:GetFileTitle()函數(shù)用于獲取制定文件的標(biāo)題,例如,當(dāng)打開了文件()函數(shù)用于獲取制定文件的標(biāo)題,例如,當(dāng)打開了文件c:aabb.dat,調(diào)用,調(diào)用GetFileTitle()就可以獲得該文件的標(biāo)題()就可以獲得該文件的標(biāo)題bb。其原型為:。其原型為:virtual CString GetFile

35、Title()() const;函數(shù)返回值即為指定文件的標(biāo)題。函數(shù)返回值即為指定文件的標(biāo)題。7.4 7.4 文件操作文件操作4、文件管理操作、文件管理操作(4)File:GetFilePath()函數(shù)()函數(shù)File:GetFilePath()函數(shù)用于獲取制定文件的全路徑。其函數(shù)原型為:()函數(shù)用于獲取制定文件的全路徑。其函數(shù)原型為:virtual CString GetFilePath();函數(shù)的返回值即為指定文件的完整路徑。函數(shù)的返回值即為指定文件的完整路徑。(5)CFile:GetStatus()函數(shù)函數(shù)CFile:GetStatus()函數(shù)用于獲取文件的狀態(tài),有兩個(gè)不同的原型:非靜態(tài)成

36、員函數(shù)用于獲取文件的狀態(tài),有兩個(gè)不同的原型:非靜態(tài)成員變量的原型和靜態(tài)成員變量原型。變量的原型和靜態(tài)成員變量原型。BOOL GetStatus(CFileStatus & rStatus) const; Static BOOL PASCAL GetStatus(LPCSTR lpszFileName, CFileStatus & rStatus);(6)CFile:Remove()函數(shù)()函數(shù) 該函數(shù)用于刪除指定的文件,是該函數(shù)用于刪除指定的文件,是CFile類的靜態(tài)成員變量,其函數(shù)原型為:類的靜態(tài)成員變量,其函數(shù)原型為:static void PASCAL Remove(LP

37、CTSTR lpszFileName);參數(shù)參數(shù)lpszFileName:表示所要?jiǎng)h除文件的路徑字符串。路徑可為相對(duì)或絕對(duì)。:表示所要?jiǎng)h除文件的路徑字符串。路徑可為相對(duì)或絕對(duì)。(7)CFile:Rename()函數(shù)()函數(shù) 該函數(shù)用于更改指定文件的文件名,也是該函數(shù)用于更改指定文件的文件名,也是CFile類的靜態(tài)成員變量,其函數(shù)原型為:類的靜態(tài)成員變量,其函數(shù)原型為:static void PASCAL Rename(LPCTSTR lpszOldName, LPCTSTR lpszNewName); 7.4 7.4 文件操作文件操作CStdioFile對(duì)文本文件進(jìn)行操作。對(duì)文本文件進(jìn)行操作。

38、 CStdioFile定義了新的成員變量定義了新的成員變量m_pStream,類型是,類型是FILE*。在打開或者創(chuàng)建文件時(shí),使用。在打開或者創(chuàng)建文件時(shí),使用_open_osfhandle從從m_hFile(Win32文件句柄文件句柄)得到一個(gè)得到一個(gè)“C”的的FILE類型的文件指針,然后,在文件操作中,使用類型的文件指針,然后,在文件操作中,使用“C”的文件操作函數(shù)。的文件操作函數(shù)。例如,讀文件使用例如,讀文件使用_fread,而不是,而不是:ReadFile,寫文件使用了,寫文件使用了_fwrite,而不是而不是:WriteFile,等等。,等等。m_hFile是是CFile的成員變量。的

39、成員變量。 另外,另外,CStdioFile不支持不支持CFile的的Dumplicate、LockRange、UnlockRange操作,但是實(shí)現(xiàn)了兩個(gè)新的操作操作,但是實(shí)現(xiàn)了兩個(gè)新的操作ReadString和和WriteString。 7.4 7.4 文件操作文件操作為了方便文件查找,為了方便文件查找,MFC把有關(guān)功能歸結(jié)成為一個(gè)類把有關(guān)功能歸結(jié)成為一個(gè)類CFileFind。CFileFind派生于派生于CObject類。首先,它使用類。首先,它使用FindFile和和FineNextFile包裝了包裝了Win32函數(shù)函數(shù):FindFirstFile和和:FindNextFile;其次,它

40、提供了;其次,它提供了許多函數(shù)用來獲取文件的狀態(tài)或者屬性。許多函數(shù)用來獲取文件的狀態(tài)或者屬性。 1FindFile函數(shù)函數(shù) FindFile函數(shù)的定義為:函數(shù)的定義為:BOOL FindFile (LPCTSTR pstrName = NULL,DWORD dwUnused = 0);返回值:如果成功,則返回真值,否則為假。返回值:如果成功,則返回真值,否則為假。參數(shù)參數(shù)pstrName:指向待找文件名字符串,可包含星號(hào),如果不填,則查:指向待找文件名字符串,可包含星號(hào),如果不填,則查找當(dāng)前目錄下的所有文件。找當(dāng)前目錄下的所有文件。參數(shù)參數(shù)dwUnused:為保留參數(shù),必須為:為保留參數(shù),必須為0或不填。或不填。2FindNextFile函數(shù)函數(shù)FindNextFile函數(shù)的定義為:函數(shù)的定義為: BOOL Find

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論