第6章 框架.ppt_第1頁
第6章 框架.ppt_第2頁
第6章 框架.ppt_第3頁
第6章 框架.ppt_第4頁
第6章 框架.ppt_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、6 框架,框架窗口 文檔模板 文檔的讀寫 文檔視圖結(jié)構(gòu),6.1 框架窗口,一、主框架窗口和文檔窗口,主框架窗口是應(yīng)用程序直接放置在桌面(DeskTop)上的那個(gè)窗口,每個(gè)應(yīng)用程序只能有一個(gè)主框架窗口,主框架窗口的標(biāo)題欄上往往顯示應(yīng)用程序的名稱。,文檔窗口對(duì)于單文檔應(yīng)用程序來說,它和主框架窗口是一致的,即主框架窗口就是文檔窗口;而對(duì)于多文檔應(yīng)用程序,文檔窗口是主框架窗口的子窗口。,6.1 框架窗口,二. 窗口狀態(tài)的改變,MFC AppWizard為每一個(gè)文檔應(yīng)用程序的框架窗口設(shè)置了相應(yīng)的大小和位置,但默認(rèn)的窗口狀態(tài)有時(shí)并不那么令人滿意,這時(shí)就需要對(duì)窗口狀態(tài)進(jìn)行適當(dāng)?shù)母淖儭?可調(diào)用CWnd類的成員

2、函數(shù)ShowWindow來改變窗口的狀態(tài),ShowWindow函數(shù)的參數(shù)值,6.1 框架窗口,6.1 框架窗口,窗口風(fēng)格決定了窗口的外觀及功能 設(shè)置方式 可通過在主窗口或文檔窗口類的PreCreateWindow函數(shù)中修改CREATESTRUCT結(jié)構(gòu)來設(shè)置, 調(diào)用CWnd類的成員函數(shù)ModifyStyle和ModifyStyleEx來更改。,三、 窗口風(fēng)格的設(shè)置,6.1 框架窗口,1、 窗口風(fēng)格,表6.2 部分窗口風(fēng)格,6.1 框架窗口,2. 在MFC AppWizard中進(jìn)行修改,選擇“文件”“新建”菜單,在彈出的“新建”對(duì)話框中選擇“工程”標(biāo)簽,選擇MFC AppWizard(exe)的項(xiàng)

3、目類型,指定項(xiàng)目工作文件夾位置,輸入項(xiàng)目名Ex_SDI2,單擊確定按鈕。,(2) 在向?qū)У牡谝徊街?,將?yīng)用程序類型選為“單個(gè)文檔”。,“新建”對(duì)話框,6.1 框架窗口,(3) 單擊下一個(gè)按鈕,出現(xiàn)向?qū)У牡诙綄?duì)話框,在這里用戶可以選擇 程序中是否加入數(shù)據(jù)庫的支持。,“Step 2”對(duì)話框,6.1 框架窗口,(4) 單擊下一個(gè)按鈕,出現(xiàn)向?qū)У牡谌綄?duì)話框,允許用戶在程序中加入復(fù)合文檔、自動(dòng)化、ActiveX控件的支持。,6.1 框架窗口,(5) 單擊下一個(gè)按鈕,出現(xiàn)向?qū)У牡谒牟綄?duì)話框,對(duì)話框的前幾項(xiàng)依次確定對(duì)浮動(dòng)工具條、打印與預(yù)覽以及通信網(wǎng)絡(luò)等特性的支持。,6.1 框架窗口,(6)單擊高級(jí)按鈕,

4、出現(xiàn)下圖所示的對(duì)話框,分別用于文檔模板字串資源內(nèi)容和窗口風(fēng)格的修改。,6.1 框 架 窗 口,(7) 單擊關(guān)閉按鈕回到向?qū)?duì)話框,單擊下一個(gè)按鈕,出現(xiàn)如下圖所示的對(duì)話框。,6.1 框 架 窗 口,(8) 單擊下一個(gè)按鈕,出現(xiàn)對(duì)話框。在這里,用戶可以對(duì)MFC AppWizard提供的默認(rèn)類名、基類名、各個(gè)源文件名進(jìn)行修改。,6.1 框 架 窗 口,3. 修改CREATESTRUCT結(jié)構(gòu),當(dāng)窗口創(chuàng)建之前,系統(tǒng)自動(dòng)調(diào)用PreCreateWindow虛函數(shù)。在用MFC AppWizard創(chuàng)建文檔應(yīng)用程序結(jié)構(gòu)時(shí),MFC已為主窗口或文檔窗口類自動(dòng)重載了該虛函數(shù)。,6.1 框 架 窗 口,BOOL CMai

5、nFrame:PreCreateWindow(CREATESTRUCT ,6.1 框 架 窗 口,4. 使用ModifyStyle和ModifyStyleEx,CWnd類中的成員函數(shù)ModifyStyle和ModifyStyleEx也可用來更改窗口的風(fēng)格,其中ModifyStyleEx還可更改窗口的擴(kuò)展風(fēng)格,6.1 框 架 窗 口,四、 改變窗口的大小和位置,用CWnd類的成員函數(shù)SetWindowPos或MoveWindow可以改變窗口的大小和位置。 SetWindowPos是一個(gè)非常有用的函數(shù),它不僅可以改變窗口的大小、位置,而且還可以改變所有窗口在堆棧排列的次序(Z次序),這個(gè)次序是根據(jù)

6、它們?cè)谄聊怀霈F(xiàn)的先后來確定的。,BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x,int y,int cs,int cy,UINT nFlags);,6.1 框 架 窗 口,表6.4 常用nFlags值及其含義,void MoveWindow(int x,int y,int nWidth,int nHeight, BOOL bRepaint=TRUE); void MoveWindow(LPCRECT lpRect, BOOL bRepaint=TRUE);,6.1 框 架 窗 口,6.2 文 檔 模 板,一、 文檔模板類,文檔應(yīng)用程序框

7、架結(jié)構(gòu)是在程序運(yùn)行一開始構(gòu)造的,在單文檔應(yīng)用程序(設(shè)項(xiàng)目名為Ex_SDI2)的應(yīng)用程序類InitInstance函數(shù)中,可以看到這樣的代碼:,BOOL CEx_SDI2App:InitInstance() CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, / 資源ID RUNTIME_CLASS(CEx_SDIDoc), / 文檔類 RUNTIME_CLASS(CMainFrame), / 主框架窗口類 RUNTIME_CLASS(CEx_SDIView); / 視圖類

8、 AddDocTemplate(pDocTemplate); return TRUE; ,6.2 文 檔 模 板,6.2 文 檔 模 板,二、 文檔模板字符串資源,在MFC AppWizard創(chuàng)建的應(yīng)用程序資源中,許多資源標(biāo)識(shí)符都是IDR_MAINFRAME,這就意味著這些具有同名標(biāo)識(shí)的資源將被框架自動(dòng)加載到應(yīng)用程序中。,6.2 文 檔 模 板,表6.5 文檔模板資源字符串的含義,6.2 文 檔 模 板,三、 使用多個(gè)文檔類型,用MFC AppWizard(exe)創(chuàng)建一個(gè)默認(rèn)的多文檔應(yīng)用程序項(xiàng)目Ex_MDIDemo。,(2) 打開項(xiàng)目工作區(qū)窗口中String Table的資源項(xiàng),雙擊該項(xiàng)下的

9、String Table,打開字符串表資源。,6.2 文 檔 模 板,(3) 雙擊IDR_MAINFRAME列表項(xiàng),彈出字符串屬性對(duì)話框,將其標(biāo)題修改為“多個(gè)文檔類型實(shí)例”。,(4) 雙擊IDR_EX_MDITYPE列表項(xiàng),在字符串屬性對(duì) 話中,將其內(nèi)容修改:,(5) 拖動(dòng)字符串表編輯器右 邊 的滾動(dòng)塊,直到出現(xiàn)最 后一個(gè)字符串項(xiàng),雙擊最 后的空行,在字符串屬性 對(duì)話框中將ID設(shè)為,修改IDR_MAINFRAME字符串標(biāo)題,添加新的字符串項(xiàng),6.2 文 檔 模 板,(6) 按快捷鍵Ctrl+W,打開MFC ClassWizard,單擊Add Class按鈕,從彈出的菜單中選擇New,出現(xiàn)“Ne

10、w Class”對(duì)話框,在Name框中輸入類名COtherDoc,在Base class組合框中選擇基類CDocument。,(7) 單擊OK按鈕,新的文檔類COtherDoc就添加到Ex_MDIDemo項(xiàng)目中。,(8) 修改CEx_MDIDemoApp:InitInstance函數(shù)代碼.,(9) 在類CEx_MDIDemoApp源代碼文件Ex_MDIDemo.cpp的開始處,添加包含前面創(chuàng)建的兩個(gè)派生類的頭文件.,添加新的文檔類COtherDoc,6.2 文 檔 模 板,編譯運(yùn)行并測(cè)試。,多類型文檔窗口顯示,文檔類型新建對(duì)話框,文件打開對(duì)話框中的文件類型,6.3 文檔的讀寫,MFC文檔讀寫機(jī)

11、制 使用簡(jiǎn)單數(shù)組集合類 建立可序化的類 文檔序列化示例 使用CFile類,6.3.1 MFC文檔讀寫機(jī)制,1. 創(chuàng)建空文檔,文檔應(yīng)用程序運(yùn)行到應(yīng)用程序類的InitInstance函數(shù)時(shí),它會(huì)在調(diào)用了AddDocTemplate函數(shù)之后,通過CWinApp: ProcessShellCommand間接調(diào)用CWinApp的另一個(gè)非常有用的成員函數(shù)OnFileNew,并依次完成工作:,1)構(gòu)造文檔對(duì)象,但并不從磁盤中讀數(shù)據(jù) 2)構(gòu)造主框架對(duì)象,并創(chuàng)建該主框架窗口,但不顯示 3)構(gòu)造視圖對(duì)象,并創(chuàng)建視圖窗口,也不顯示 4)通過內(nèi)部機(jī)制,使文檔、主框架和視圖的對(duì)象之間真正建立聯(lián)系 5)調(diào)用文檔對(duì)象的CD

12、ocument:OnNewDocument虛函數(shù),并調(diào)用CDocument:DeleteContents虛函數(shù)清除文檔對(duì)象的內(nèi)容。 6)調(diào)用視圖對(duì)象的CView:OnInitialUpdate虛函數(shù)對(duì)視圖進(jìn)行初始化操作 7)調(diào)用框架對(duì)象的CFrameWnd:ActiveFrame虛函數(shù),以便顯示帶有菜單、工具欄、狀態(tài)欄及視圖窗口的主框架窗口。,6.3.1 MFC文檔讀寫機(jī)制,6.3.1 MFC文檔讀寫機(jī)制,2. 打開文檔,當(dāng)MFC AppWizard創(chuàng)建文檔應(yīng)用程序時(shí),它會(huì)自動(dòng)將“文件(File)”菜單中的“打開(Open)”命令(ID號(hào)為ID_FILE_OPEN)映射到CWinApp的OnF

13、ileOpen成員函數(shù)。,(1) 彈出“打開”對(duì)話框,讓用戶提供一個(gè)文件名。,(2) 調(diào)用文檔對(duì)象CDocument:OnOpenDocument虛函數(shù)(打開文檔并清空文檔對(duì)象內(nèi)容),然后創(chuàng)建一個(gè)CArchive對(duì)象用于數(shù)據(jù)的讀取,接著又自動(dòng)調(diào)用Serialize函數(shù)。,(3) 調(diào)用視圖對(duì)象CView:OnInitialUpdate虛函數(shù)。,6.3.1 MFC文檔讀寫機(jī)制,3. 保存文檔,當(dāng)MFC AppWizard創(chuàng)建應(yīng)用程序時(shí),它會(huì)自動(dòng)將“文件(File)”菜單中的“保存(Save)”命令與文檔類CDocument的OnFileSave函數(shù)在內(nèi)部關(guān)聯(lián)起來,但用戶在程序框架中看不到相應(yīng)的代碼

14、。,(1) 彈出“保存”對(duì)話框,讓用戶提供一個(gè)文件名。,(2) 調(diào)用文檔對(duì)象CDocument:OnSaveDocument虛函數(shù),接著自動(dòng)調(diào)用Serialize函數(shù),將CArchive對(duì)象的內(nèi)容保存到文檔。,6.3.1 MFC文檔讀寫機(jī)制,4. 關(guān)閉文檔,(1) 若文檔內(nèi)容已被修改,則彈出一個(gè)消息對(duì)話框,詢問用戶是否需要將文檔保存。,(2) 調(diào)用CDocument:OnCloseDocument虛函數(shù),關(guān)閉所有與該文檔相關(guān)聯(lián)的文檔窗口及相應(yīng)的視圖,調(diào)用文檔類CDocument的DeleteContents清除文檔數(shù)據(jù)。,6.3.1 MFC文檔讀寫機(jī)制,5. 文檔讀寫操作,打開和保存文檔時(shí),系

15、統(tǒng)都會(huì)自動(dòng)調(diào)用Serialize函數(shù)。事實(shí)上,MFC AppWizard在創(chuàng)建文檔應(yīng)用程序框架時(shí)已在文檔類中重載了Serialize函數(shù),通過在該函數(shù)中添加代碼可達(dá)到實(shí)現(xiàn)數(shù)據(jù)序列化的目的。,ar中可以使用運(yùn)算符的數(shù)據(jù)類型,1. 簡(jiǎn)單數(shù)組集合類的構(gòu)造及元素的添加,對(duì)簡(jiǎn)單數(shù)組集合類構(gòu)造的方法都是一樣的,均是使用各自的構(gòu)造函數(shù),它們的原型如下:,CByteArray CByteArray( ); CDWordArray CDWordArray( ); CObArray CObArray( ); CPtrArray CPtrArray( ); CStringArray CStringArray( );

16、 CUIntArray CUIntArray( ); CWordArray CWordArray( );,6.3.2. 使用簡(jiǎn)單數(shù)組集合類,6.3.2. 使用簡(jiǎn)單數(shù)組集合類,2. 訪問簡(jiǎn)單數(shù)組集合類的元素,/ CObArray:operator 示例 CObArray array; CAge* pa; / CAge是一個(gè)用戶類 array.Add( new CAge( 21 ) ); / 添加一個(gè)元素 array.Add( new CAge( 40 ) ); / 再添加一個(gè)元素 pa = (CAge*)array0; / 獲取元素0 ASSERT( *pa = CAge( 21 ) ); ar

17、ray0 = new CAge( 30 ); / 替換元素0; ASSERT( *(CAge*) array0 = CAge( 30 ) );,/ CObArray:GetAt示例 CObArray array; array.Add( new CAge( 21 ) ); / 元素 0 array.Add( new CAge( 40 ) ); / 元素 1 ASSERT( *(CAge*) array.GetAt( 0 ) = CAge( 21 ) );,6.3.2. 使用簡(jiǎn)單數(shù)組集合類,在MFC中,既可以使用GetAt函數(shù),也可使用“ ”操作符:,6.3.2. 使用簡(jiǎn)單數(shù)組集合類,3. 刪除簡(jiǎn)

18、單數(shù)組集合類的元素,(1) 使用函數(shù)GetSize和整數(shù)下標(biāo)值訪問簡(jiǎn)單數(shù)組集合類中的元素。,(2) 若對(duì)象元素是在堆內(nèi)存中創(chuàng)建的,則使用delete操作符刪除每一個(gè)對(duì)象元素。,(3) 調(diào)用函數(shù)RemoveAll刪除簡(jiǎn)單數(shù)組集合類中的所有元素。,CObArray array; CAge* pa1; CAge* pa2; array.Add( pa1 = new CAge( 21 ) ); array.Add( pa2 = new CAge( 40 ) ); ASSERT( array.GetSize() = 2 ); for (int i=0;iarray.GetSize();i+) delet

19、e array.GetAt(i); array.RemoveAll();,下面代碼過程是一個(gè)CObArray的刪除示例:,6.3.2. 使用簡(jiǎn)單數(shù)組集合類,6.3.3. 建立可序列化的類,使一個(gè)類可序列化的目的是使其具有CArchive的序列化功能,即可以在文檔類中的Serialize函數(shù)中直接通過CArchive引用變量進(jìn)行該類數(shù)據(jù)的讀寫操作。,在MFC中,一個(gè)可序列化的類必須是CObject的一個(gè)派生類,且在類聲明中,需要包含DECLARE_SERIAL宏調(diào)用,而在類的實(shí)現(xiàn)文件中包含IMPLEMENT_SERIAL宏調(diào)用,這個(gè)宏有三個(gè)參數(shù):前兩個(gè)參數(shù)分別表示類名和基類名,第三個(gè)參數(shù)表示應(yīng)用

20、程序的版本號(hào)。最后還需要重載Serialize函數(shù),使該類的數(shù)據(jù)成員進(jìn)行相關(guān)序列化操作。,6.3.4. 文檔序列化示例,添加用于學(xué)生基本信息記錄輸入的對(duì)話框,對(duì)話框資源的復(fù)制,學(xué)生基本信息輸入對(duì)話框,6.3.4. 文檔序列化示例,2. 添加并處理菜單項(xiàng),在Ex_StudentDoc.cpp文件的開始處,添加包含CStuInfoDlg類的頭文件包含。,(2) 在菜單資源的主菜單中添加頂層菜單項(xiàng)“學(xué)生基本信息( if (dlg.DoModal() != IDOK) return; / 添加記錄 CStudentInfo *pStudent = new CStudentInfo (dlg.m_str

21、Name,dlg.m_strNo, dlg.m_bMale, dlg.m_tBirth, dlg.m_strSpecial); m_stuObArray.Add(pStudent); SetModifiedFlag(); / 設(shè)置文檔更改標(biāo)志 UpdateAllViews(NULL); / 更新視圖 ,6.3.4. 文檔序列化示例,3. 修改CEx_StudentDoc類代碼,在Ex_StudentDoc.h文件的class CEx_StudentDoc前面,添加包含CStudentInfo類的頭文件。,(2) 為CEx_StudentDoc類添加下列成員變量: public: CObArra

22、y m_stuObArray; / 對(duì)象集合類對(duì)象,(3) 為CEx_StudentDoc類添加成員函數(shù)CStudentInfo* GetStudentInfoAt(int nIndex),用來獲取m_stuObArray中指定索引號(hào)的CStudentInfo類指針,,為CEx_StudentDoc類添加成員函數(shù)int GetAllRecNum(void),用于獲取集合類中對(duì)象的個(gè)數(shù)其代碼如下:,int CEx_StudentDoc:GetAllRecNum() return m_stuObArray.GetSize(); ,6.3.4. 文檔序列化示例,(5) 在CEx_StudentDoc

23、類析構(gòu)函數(shù)CEx_StudentDoc添加下列代碼: CEx_StudentDoc:CEx_StudentDoc() int nIndex = GetAllRecNum(); while (nIndex-) delete m_stuObArray.GetAt(nIndex); / 刪除并釋放對(duì)象的內(nèi)存空間 m_stuObArray.RemoveAll(); ,(6) 在CEx_StudentDoc:Serialize函數(shù)中添加下列代碼: void CEx_StudentDoc:Serialize(CArchive ,6.3.4. 文檔序列化示例,4. 修改CEx_StudentView類代碼,

24、void CEx_StudentView:OnDraw(CDC* pDC) CEx_StudentDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int y = 0; for (int nIndex = 0; nIndex GetAllRecNum(); nIndex+) pDoc-GetStudentInfoAt(nIndex)-Display(y, pDC); y += 16; ,將CEx_StudentView:OnDraw代碼修改,用來將所有的學(xué)生基本信息記錄顯示在視圖中:,6.3.4. 文檔序列化示例,5. 修改文檔的字串資源 打開文檔的

25、字串資源IDR_MAINFRAME,將其內(nèi)容修改為:,6. 編譯運(yùn)行并測(cè)試,Ex_Student運(yùn)行結(jié)果,Ex_StudentnStudentRecnEx_Stun記錄文件(*.rec)n.recnExStudent.DocumentnEx_Stu Document,6.3.5. 使用CFile類,文件的打開和關(guān)閉,(1) 構(gòu)造一個(gè)不帶指定任何參數(shù)的CFile對(duì)象;,(2) 調(diào)用成員函數(shù)Open并指定文件路徑以及文件標(biāo)志,表6.7 CFile類的文件訪問方式,6.3.5. 使用CFile類,2. 文件的讀寫和定位,CFile 還支持獲取文件狀態(tài),包括文件是否存在、創(chuàng)建與修改的日期和時(shí)間、邏輯大

26、小和路徑等。,3. CFile和CArchive類之間的關(guān)聯(lián),可以將一個(gè)外部磁盤文件和一個(gè)CArchive 對(duì)象關(guān)聯(lián)起來。,3. 獲取文件的有關(guān)信息,使用Read、Write、Seek成員函數(shù),6.4 文檔視圖結(jié)構(gòu),一般視圖類的使用 文檔與視圖的相互作用 應(yīng)用程序?qū)ο笾羔樀幕フ{(diào) 切分窗口 一檔多視,6.4.1. 一般視圖類的使用,MFC中的CView類及其它的派生類封裝了視圖的各種不同的功能,它們?yōu)橛脩魧?shí)現(xiàn)最新的Windows特性提供了很大的便利。,表6.8 CView的派生類及其功能描述,6.4.1. 一般視圖類的使用,續(xù)表6.8 CView的派生類及其功能描述,6.4.1. 一般視圖類的使

27、用,1. CEditView類,CEditView類對(duì)象是一種視圖,像CEdit類一樣,它也提供窗口編輯控制功能,可以用來執(zhí)行簡(jiǎn)單文本操作,如打印、查找、替換、剪貼板的剪切、復(fù)制和粘貼等。,更改CEx_EditView的基類,Ex_Edit運(yùn)行結(jié)果,6.4.1. 一般視圖類的使用,2. CRichEditView類,CRichEditView類使用了復(fù)文本編輯控件,因此它支持混合字體格式和更大數(shù)據(jù)量的文本。CRichEditView類被設(shè)計(jì)成與CRichEditDoc和CRichEditCntrItem 類一起使用,它們可實(shí)現(xiàn)一個(gè)完整的ActiveX包容器應(yīng)用程序。,6.4.1. 一般視圖類的

28、使用,3. CFormView類,(1) 添加并設(shè)計(jì)表單,“New Form”對(duì)話框,添加表單后的開發(fā)環(huán)境,6.4.1. 一般視圖類的使用,(2) 完善代碼并測(cè)試,Ex_Form運(yùn)行結(jié)果,Ex_Form最終運(yùn)行結(jié)果,6.4.1. 一般視圖類的使用,4 CHtmlView 類,CHtmlView 類是在文檔視圖結(jié)構(gòu)中提供WebBrowser控件的功能。,5 CScrollView類,6 列表視圖,CScrollView類不僅能直接支持視圖的滾動(dòng)操作,而且還能管理視口的大小和映射模式,并能響應(yīng)滾動(dòng)條消息、鍵盤消息以及鼠標(biāo)滾輪消息。,列表視圖類CListView按照MFC文檔視圖結(jié)構(gòu)封裝了列表控件C

29、ListCtrl的功能。,7 樹視圖,6.4.2. 文檔與視圖的相互作用,CView:GetDocument函數(shù),視圖對(duì)象只有一個(gè)與之相聯(lián)系的文檔對(duì)象,它所包含的GetDocument函數(shù)允許應(yīng)用程序由視圖得到與之相關(guān)聯(lián)的文檔。,2. CDocument:UpdateAllViews函數(shù),如果文檔中的數(shù)據(jù)發(fā)生了改變,那么所有的視圖都必須被通知到,以便它們能夠?qū)λ@示的數(shù)據(jù)進(jìn)行相應(yīng)的更新。,3. CView:OnUpdate函數(shù),這是一個(gè)虛函數(shù)。,6.4.2. 文檔與視圖的相互作用,4. CView:OnInitialUpdate函數(shù),當(dāng)應(yīng)用程序被啟動(dòng)時(shí),或當(dāng)用戶從“文件”菜單中選擇了“新建”或

30、“打開”時(shí),該CView虛函數(shù)都會(huì)被自動(dòng)調(diào)用。,5. CDocument:OnNewDocument函數(shù),在文檔應(yīng)用程序中,當(dāng)用戶從“文件”菜單中選擇“新建”命令時(shí),框架將首先構(gòu)造一個(gè)文檔對(duì)象,然后調(diào)用該虛函數(shù)。,6.4.3. 應(yīng)用程序?qū)ο笾羔樀幕フ{(diào),從文檔類中獲取視圖對(duì)象指針,在文檔類中有一個(gè)與其關(guān)聯(lián)的各視圖對(duì)象的列表,并可通過CDocument類的成員函數(shù)GetFirstViewPosition和GetNextView來定位相應(yīng)的視圖對(duì)象。,6.4.3. 應(yīng)用程序?qū)ο笾羔樀幕フ{(diào),void CMyDoc:OnRepaintAllViews() POSITION pos = GetFirstV

31、iewPosition(); while (pos != NULL) CView* pView = GetNextView(pos); pView-UpdateWindow(); / 實(shí)現(xiàn)上述功能也可直接調(diào)用 UpdateAllViews(NULL);,用CDocument:GetFirstViewPosition和GetNextView重繪每個(gè)視圖:,6.4.3. 應(yīng)用程序?qū)ο笾羔樀幕フ{(diào),2. 從視圖類中獲取文檔對(duì)象和主框架對(duì)象指針,在視圖類中獲取文檔對(duì)象指針是很容易的,只需調(diào)用視圖類中的成員函數(shù)GetDocument即可。,3. 在主框架類中獲取視圖對(duì)象指針,對(duì)于單文檔應(yīng)用程序來說,只需調(diào)

32、用CFrameWnd類的GetActiveView成員函數(shù)即可,在視圖類中獲取主框架對(duì)象指針: CWnd:GetParentFrame(),對(duì)于多文檔應(yīng)用程序來說,應(yīng)先得到子框架(GetActiveFrame或MDIGetActive函數(shù)),再調(diào)用CFrameWnd類的GetActiveView成員函數(shù),6.4.3. 應(yīng)用程序?qū)ο笾羔樀幕フ{(diào),各種對(duì)象指針的互調(diào)方法,6.4.4. 切 分 窗 口,1. 靜態(tài)切分和動(dòng)態(tài)切分,對(duì)于“靜態(tài)切分”窗口來說,當(dāng)窗口第一次被創(chuàng)建時(shí),窗格就已經(jīng)被切分好了,窗格的次序和數(shù)目不能再被改變,但用戶可以移動(dòng)切分條來調(diào)整窗格的大小。,對(duì)于“動(dòng)態(tài)切分”窗口來說,它允許用戶

33、在任何時(shí)候?qū)Υ翱谶M(jìn)行切分,用戶既可以通過選擇菜單項(xiàng)來對(duì)窗口進(jìn)行切分,也可以通過拖動(dòng)滾動(dòng)條中的切分塊對(duì)窗口進(jìn)行切分。,6.4.4. 切 分 窗 口,2. 切分窗口的CSplitterWnd類操作,BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE |WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_

34、PANE_FIRST ); BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );,函數(shù)原型:,6.4.4. 切 分 窗 口,3. 靜態(tài)切分窗口簡(jiǎn)單示例,(1) 用MFC AppWizard(exe)創(chuàng)建一個(gè)單文檔應(yīng)用程序Ex_SplitSDI。,(2) 打開框架窗口類MainFrm.h頭文件,為CMainFrame類添加一個(gè)保護(hù)型的切分窗口的數(shù)據(jù)成員.,(3) 用MFC ClassWiza

35、rd創(chuàng)建一個(gè)新的視圖類CDemoView(基類為CView)用于與靜態(tài)切分的窗格相關(guān)聯(lián)。,(4) 用MFC ClassWizard為CMainFrame類添加OnCreateClient(當(dāng)主框架窗口客戶區(qū)創(chuàng)建的時(shí)候自動(dòng)調(diào)用該函數(shù))函數(shù)重載.,(5) 在MainFrm.cpp源文件的開始處,添加視圖類CDemoView的包含文件:,(6) 編譯并運(yùn)行。,#include DemoView.h,6.4.4. 切 分 窗 口,4. 動(dòng)態(tài)切分窗口簡(jiǎn)單示例,用MFC AppWizard(exe)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_DySplit。,(2) 選擇“工程”“添加工程”“Components

36、and Controls”,彈出對(duì)話框。,(3) 雙擊“Visual C+ Components”,出現(xiàn)Visual C+支持的組件,選中Splitter Bar。,單文檔應(yīng)用程序的動(dòng)態(tài)切分,Visual C+支持的組件,6.4.4. 切 分 窗 口,(4) 單擊Insert按鈕,出現(xiàn)一個(gè)消息對(duì)話框,詢問是否要插入Splitter Bar組件,單擊確定按鈕,彈出對(duì)話框。,(5) 選中Both選項(xiàng),單擊OK按鈕,回到上圖對(duì)話框,單擊結(jié)束按鈕,動(dòng)態(tài)切分就被添加到單文檔應(yīng)用程序的主框架窗口類CMainFrame中。,(6) 編譯運(yùn)行,結(jié)果如圖所示。,Splitter Bar組件選項(xiàng)對(duì)話框,Ex_Dy

37、Split運(yùn)行結(jié)果,6.4.5. 一 檔 多 視,MFC對(duì)于“一檔多視”提供下列三個(gè)模式:,在各自MDI文檔窗口中包含同一個(gè)視圖類的多個(gè)視圖對(duì)象。,(2) 在同一個(gè)文檔窗口中包含同一個(gè)視圖類的多個(gè)視圖對(duì)象。,(3) 在單獨(dú)一個(gè)文檔窗口中包含不同視圖類的多個(gè)視圖對(duì)象。,Ex_Rect運(yùn)行結(jié)果,6.4.5. 一 檔 多 視,1.設(shè)計(jì)并完善切分窗口左邊的表單視圖,(1) 用MFC AppWizard(exe)創(chuàng)建一個(gè)多文檔應(yīng)用程序Ex_Rect。,(2) 打開表單模板資源IDD_EX_RECT_FORM,調(diào)整表單模板大小,并依 次添加控件。,添 加 的 控 件,6.4.5. 一 檔 多 視,(3)

38、打開MFC ClassWizard的Member Variables標(biāo)簽,在Class name中選擇CEx_RectView,選中所需的控件ID號(hào),雙擊鼠標(biāo),依次為下列控件添加成員變量,如表所示。,(4) 在CEx_RectDoc類中添加一個(gè)公有型的CPoint數(shù)據(jù)成員m_ptRect,用來記錄小方塊的位置。,控 件 變 量,6.4.5. 一 檔 多 視,(5) 在CEx_RectDoc類的構(gòu)造函數(shù)處添加下列代碼:,CEx_RectDoc:CEx_RectDoc() m_ptRect.x = m_ptRect.y = 0;/ 或m_ptRect = CPoint(0,0) ,(6) 用MFC

39、 ClassWizard為編輯框IDC_EDIT1和IDC_EDIT2添加EN_CHANGE的消息映射,使它們的映射函數(shù)名都設(shè)為OnChangeEdit,并添加下列代碼:,void CEx_RectView:OnChangeEdit() UpdateData(TRUE); CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument(); pDoc-m_ptRect.x = m_CoorX; pDoc-m_ptRect.y = m_CoorY; CPoint pt(m_CoorX, m_CoorY); pDoc-UpdateAllViews(NULL, 2, (C

40、Object *) ,6.4.5. 一 檔 多 視,(7) 用MFC ClassWizard為CEx_RectView添加OnUpdate的消息函數(shù),并添加下列代碼: void CEx_RectView:OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) if (lHint = 1) CPoint* pPoint = (CPoint *)pHint; m_CoorX = pPoint-x;m_CoorY = pPoint-y; UpdateData(FALSE);/ 在控件中顯示 CEx_RectDoc* pDoc = (CEx_Rec

41、tDoc*)GetDocument(); pDoc-m_ptRect = *pPoint;/ 保存在文檔類中的 m_ptRect ,6.4.5. 一 檔 多 視,(8) 在CEx_RectView:OnInitialUpdate中添加一些初始化代碼: void CEx_RectView:OnInitialUpdate() CFormView:OnInitialUpdate(); ResizeParentToFit(); CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument(); m_CoorX = pDoc-m_ptRect.x;m_CoorY = pDo

42、c-m_ptRect.y; m_SpinX.SetRange(0, 1024); m_SpinY.SetRange(0, 768); UpdateData(FALSE); ,6.4.5. 一 檔 多 視,(9) 這時(shí)編譯并運(yùn)行程序,程序會(huì)出現(xiàn)一個(gè)運(yùn)行錯(cuò)誤,(10) 為CEx_RectView添加一個(gè)BOOL型的成員變量m_bEditOK。,(11) 在CEx_RectView構(gòu)造函數(shù)中將m_bEditOK的初值設(shè)為FALSE。,(12) 在CEx_RectView:OnInitialUpdate函數(shù)的最后將m_bEditOK置為TRUE,如下面的代碼:,void CEx_RectView:On

43、InitialUpdate() UpdateData(FALSE); m_bEditOK = TRUE; ,(13) CEx_RectView:OnChangeEdit函數(shù)的最前面添加語句:,6.4.5. 一 檔 多 視,BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) CRect rect; GetWindowRect( ,2. 添加視圖類并創(chuàng)建切分窗口,用MFC ClassWizard為添加一個(gè)新的CView的派生類CDrawView。,(2) 用MFC ClassWizard為CChildFrame類添加OnCreateClient函數(shù)的重載,并添加下列代碼:,6.4.5. 一 檔 多 視,(3) 在ChildFrm.cpp的前面添加下列語句:,#include ChildFrm.h #include Ex_RectView.h #include DrawView.h,(4)

溫馨提示

  • 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)論