第三章 單文檔應(yīng)用程序_第1頁
第三章 單文檔應(yīng)用程序_第2頁
第三章 單文檔應(yīng)用程序_第3頁
第三章 單文檔應(yīng)用程序_第4頁
第三章 單文檔應(yīng)用程序_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第三章 單文檔應(yīng)用程序在本學(xué)習(xí)情境中主要學(xué)習(xí):(1)單文檔應(yīng)用框架(2)文檔與視圖3.1 MFC消息處理3.1.1事件驅(qū)動(dòng)程序設(shè)計(jì)事件驅(qū)動(dòng)程序設(shè)計(jì)是一種全新的程序設(shè)計(jì)方法,它不是由事件的順序來控制,而是由事件的發(fā)生來控制,而這種事件的發(fā)生是隨機(jī)的、不確定的,并沒有預(yù)定的順序,這樣就允許程序的的用戶用各種合理的順序來安排程序的流程。對(duì)于需要用戶交互的應(yīng)用程序來說,事件驅(qū)動(dòng)的程序設(shè)計(jì)有著過程驅(qū)動(dòng)方法無法替代的優(yōu)點(diǎn)。它是一種面向用戶的程序設(shè)計(jì)方法,它在程序設(shè)計(jì)過程中除了完成所需功能之外,更多的考慮了用戶可能的各種輸入,并針對(duì)性的設(shè)計(jì)相應(yīng)的處理程序。它是一種“被動(dòng)”式程序設(shè)計(jì)方法,程序開始運(yùn)行時(shí),處于

2、等待用戶輸入事件狀態(tài),然后取得事件并作出相應(yīng)反應(yīng),處理完畢又返回并處于等待事件狀態(tài)。它的框圖如圖1所示:圖1事件驅(qū)動(dòng)程序模型3.1.2 MFC的消息處理在DOS應(yīng)用程序下,可以通過getchar()、getch()等函數(shù)直接等待鍵盤輸入,并直接向屏幕輸出。而在Windows下,由于允許多個(gè)任務(wù)同時(shí)運(yùn)行,應(yīng)用程序的輸入輸出是由Windows來統(tǒng)一管理的。Windows操作系統(tǒng)包括三個(gè)內(nèi)核基本元件:GDI, KERNEL ,USER。其中GDI(圖形設(shè)備接口)負(fù)責(zé)在屏幕上繪制像素、打印硬拷貝輸出,繪制用戶界面包括窗口、菜單、對(duì)話框等。系統(tǒng)內(nèi)核KERNEL支持與操作系統(tǒng)密切相關(guān)的功能:如進(jìn)程加載,文

3、本切換、文件I/O,以及內(nèi)存管理、線程管理等。USER為所有的用戶界面對(duì)象提供支持,它用于接收和管理所有輸入消息、系統(tǒng)消息并把它們發(fā)給相應(yīng)的窗口的消息隊(duì)列。消息隊(duì)列是一個(gè)系統(tǒng)定義的內(nèi)存塊,用于臨時(shí)存儲(chǔ)消息;或是把消息直接發(fā)給窗口過程。每個(gè)窗口維護(hù)自己的消息隊(duì)列,并從中取出消息,利用窗口函數(shù)進(jìn)行處理。框圖2如下:圖2 消息驅(qū)動(dòng)模型從消息的發(fā)送途徑上看,消息分兩種:隊(duì)列消息和非隊(duì)列消息。隊(duì)列消息送到系統(tǒng)消息隊(duì)列,然后到線程消息隊(duì)列;非隊(duì)列消息直接送給目的窗口過程。Windows維護(hù)一個(gè)系統(tǒng)消息隊(duì)列(System message queue),每個(gè)GUI線程有一個(gè)線程消息隊(duì)列(Thread mess

4、age queue)。鼠標(biāo)、鍵盤事件由鼠標(biāo)或鍵盤驅(qū)動(dòng)程序轉(zhuǎn)換成輸入消息并把消息放進(jìn)系統(tǒng)消息隊(duì)列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次從系統(tǒng)消息隊(duì)列移走一個(gè)消息,確定它是送給哪個(gè)窗口的和這個(gè)窗口是由哪個(gè)線程創(chuàng)建的,然后,把它放進(jìn)窗口創(chuàng)建線程的線程消息隊(duì)列。線程消息隊(duì)列接收送給該線程所創(chuàng)建窗口的消息。線程從消息隊(duì)列取出消息,通過Windows把它送給適當(dāng)?shù)拇翱谶^程來處理。除了鍵盤、鼠標(biāo)消息以外,隊(duì)列消息還有WM_PAINT、WM_TIMER和WM_QUIT。這些隊(duì)列消息以外的絕大多數(shù)消息是非隊(duì)列消息。通過消息映射,我們

5、可以把消息和它的消息處理函數(shù)聯(lián)系起來。VC+為我們提供了Class Wizard 來為用戶添加一個(gè)消息映射關(guān)系,而用戶只需編寫該消息發(fā)生響應(yīng)的函數(shù)即可。從View菜單中選擇“ClassWizard”命令,便可調(diào)出如圖3所示的ClassWizard對(duì)話框,它一共分為五個(gè)選項(xiàng)卡,依次分別是消息映射、成員變量、自動(dòng)化、ActiveX事件和類信息。最常用的是消息映射和成員變量?jī)蓚€(gè)選項(xiàng)卡,如果程序中使用了ActiveX控件,那么還需要使用ActiveX事件選項(xiàng)卡來添加事件處理函數(shù),類信息選項(xiàng)卡可用來了解各個(gè)類的文件名、基類和資源等信息,自動(dòng)化選項(xiàng)卡只有在編寫OLE自動(dòng)化服務(wù)器時(shí)才用得著。下面我們就來看看

6、消息映射和成員變量?jī)蓚€(gè)選項(xiàng)卡的特點(diǎn)和用途。 消息映射選項(xiàng)卡主要用途是為選中的類添加消息處理函數(shù)。其中,Projects組合框用于選擇Workspace中的一個(gè)工程,Class name組合框用于選擇工程中的一個(gè)類。Objects IDs中列出了所選擇的類的名稱及屬于它的一系列ID,對(duì)于CXXXView類來說,列出的ID基本上都是菜單命令,對(duì)于一個(gè)對(duì)話框類來說,列出的ID多數(shù)對(duì)應(yīng)著對(duì)話框模板中的控件。從Objects IDs選擇不同的類名或ID后,右邊的Messages列表框中的內(nèi)容也會(huì)跟著改變,選中類名時(shí),Messages列表框中會(huì)顯示出所有該類能處理的標(biāo)準(zhǔn)Windows消息以及該類可以重載的

7、成員函數(shù),選中一個(gè)ID時(shí),Messages列表框中會(huì)顯示出這個(gè)ID對(duì)應(yīng)的對(duì)象(菜單選項(xiàng)或控件)所能引發(fā)的命令消息和通知消息。在Messages列表框中選擇一條消息(或一個(gè)可以重載的成員函數(shù))后,如果該消息還沒有相應(yīng)的消息處理函數(shù)(或還未重載該成員函數(shù)),那么ClassWizard對(duì)話框右上角的Add Function按鈕就會(huì)變?yōu)橛行?,提示我們可以添加一個(gè)消息處理函數(shù)(或重載該成員函數(shù)),按下Add Function按鈕后,ClassWizard就會(huì)在所選的類中添加一個(gè)處理函數(shù)(為一個(gè)ID添加處理函數(shù)時(shí),還會(huì)彈出一個(gè)對(duì)話框,要求輸入函數(shù)名),并在Member funtions列表框中顯示出剛添加

8、的函數(shù),在這個(gè)列表框中雙擊該函數(shù)名后,ClassWizard對(duì)話框?qū)⒆詣?dòng)關(guān)閉,文本編輯器會(huì)定位在函數(shù)的實(shí)現(xiàn)代碼處,這些代碼及它在類定義中的聲明都是由ClassWizard自動(dòng)生成的。圖 3 Class wizard 對(duì)話框Member functions列表框并沒有列出類的所有成員函數(shù),而只是列出了消息處理函數(shù)和重載的成員函數(shù),其中每個(gè)函數(shù)的左邊都有一個(gè)小圖標(biāo),如果小圖標(biāo)為“W”字樣,表示該函數(shù)是一個(gè)消息處理函數(shù),除了Add function按鈕外,消息映射選項(xiàng)卡中還有三個(gè)按鈕,其中Delete Function用來刪除一個(gè)消息處理函數(shù)或重載的成員函數(shù),但是此按鈕只能刪除函數(shù)在類定義中的聲明,

9、函數(shù)的實(shí)現(xiàn)代碼還需要手工來刪除;Edit Code按鈕的用途相當(dāng)于在Member functions中雙擊一個(gè)成員函數(shù);Add Class按鈕則可用于向工程中添加一個(gè)新的類。3.1.3 文檔與視圖先利用Appwizard 來新建一個(gè)單文檔工程。在SDI框架程序中,主要包含四個(gè)類:主框架類:CMainFrame用于管理主程序窗口,從MFC 類的CFrameWnd派生。應(yīng)用類:CXXXApp負(fù)責(zé)初始化及程序結(jié)束前的整理工作,從MFC 類的CWinApp派生。文檔類:CXXXDoc負(fù)責(zé)存放程序數(shù)據(jù)和在磁盤上讀寫數(shù)據(jù),從MFC 類的CDocment派生。視圖類:CXXXView負(fù)責(zé)數(shù)據(jù)的顯示及處理用戶

10、的輸入,從MFC類的CView派生。用戶對(duì)話框類:CAboutDlg負(fù)責(zé)用戶對(duì)話框的設(shè)置,從MFC類的CDialog類派生。文檔是存儲(chǔ)的對(duì)象.文檔類負(fù)責(zé)數(shù)據(jù)的維護(hù),包括數(shù)據(jù)的讀取、存儲(chǔ)和修改,并將更改的數(shù)據(jù)通知相關(guān)視圖,另外它還負(fù)責(zé)將數(shù)據(jù)存儲(chǔ)到文件及從文件中讀取數(shù)據(jù)。文檔是一種數(shù)據(jù)源,數(shù)據(jù)源有很多種,最常見的是磁盤文件,但它不必是一個(gè)磁盤文件,文檔的數(shù)據(jù)源也可以來自串行口、網(wǎng)絡(luò)或攝像機(jī)輸入信號(hào)等。文檔對(duì)象負(fù)責(zé)來自所有數(shù)據(jù)源的數(shù)據(jù)的管理。視圖類的作用是與用戶交互。視圖對(duì)象負(fù)責(zé)對(duì)保存在文擋對(duì)象中的數(shù)據(jù)以某種方式進(jìn)行顯示,并接受用戶的輸入,將這些輸入交文擋類進(jìn)行處理。視圖是數(shù)據(jù)的用戶窗口,為用戶提供

11、了文檔的可視的數(shù)據(jù)顯示,它把文檔的部分或全部?jī)?nèi)容在窗口中顯示出來。視圖還給用戶提供了一個(gè)與文檔中的數(shù)據(jù)交互的界面,它把用戶的輸入轉(zhuǎn)化為對(duì)文檔中數(shù)據(jù)的操作。每個(gè)文檔都會(huì)有一個(gè)或多個(gè)視圖顯示,一個(gè)文檔可以有多個(gè)不同的視圖。比如,在Excel電子表格中,我們可以將數(shù)據(jù)以表格方式顯示,也可以將數(shù)據(jù)以圖表方式顯示。一個(gè)視圖既可以輸出到窗口中,也可以輸出到打印機(jī)上。圖 文檔與視圖關(guān)系3.1.4 鼠標(biāo)消息舉例 我們先通過一個(gè)例子來說明如何用class wizard 來實(shí)現(xiàn)捕獲鼠標(biāo)消息,進(jìn)行消息映射和定義消息處理函數(shù).利用class wizard來設(shè)置消息選項(xiàng)。選擇ClassName中的CXXXView,選擇

12、其中相對(duì)應(yīng)的WM_LBUTTONDOWN,雙擊選中的消息,單擊Edit Code 按紐,如圖4所示,并增加相關(guān)代碼,如圖5所示。圖4 增加鼠標(biāo)消息映射圖5 增加代碼圖6 運(yùn)行結(jié)果3.1.4鍵盤消息舉例鍵盤的輸入是從掃描碼開始的,windows鍵盤驅(qū)動(dòng)程序?qū)⑦@些掃描碼轉(zhuǎn)換成為與硬件無關(guān)的形式,即虛擬鍵碼.WM_CHAR:此消息在鍵被按下時(shí)產(chǎn)生,通常用于處理非打印鍵中的按鍵消息.圖7 在工程中增加相關(guān)變量圖8 增加變量Text圖9 初始化變量為空?qǐng)D10 增加鍵盤的消息影射圖11 編寫Onchar處理函數(shù)圖12 輸出接收到的字符圖13 運(yùn)行結(jié)果為了能夠?qū)崿F(xiàn)輸入字符的換行功能,在CXXXDoc類中增加

13、一個(gè)用來計(jì)算行數(shù)的成員變量m_Line,如圖14所示,并初始化變量m_Line,如圖15所示。圖 增加成員變量圖15 初始化成員變量為了保存字符串行的數(shù)據(jù),定義一個(gè)字符串列表變量m_strList,如圖16所示。圖16 定義字符串列表變量 修改CXXXView類中的OnChar函數(shù),如下所示。void CSDIView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultCSDIDoc *pDoc=GetDocument();ASS

14、ERT_VALID(pDoc);if(nChar=VK_RETURN)pDoc-m_Line+;pDoc-m_strList.AddTail(pDoc-Text);pDoc-Text.Empty(); Invalidate();elsepDoc-Text+=nChar;CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);int nLineHeight=tm.tmHeight+tm.tmExternalLeading;dc.TextOut(0,pDoc-m_Line*nLineHeight,pDoc-Text);CView:OnChar

15、(nChar, nRepCnt, nFlags);為了保證能夠?qū)XXXDoc類中m_strList的數(shù)據(jù)輸出出來,增加一個(gè)DrawText函數(shù),如圖17所示和圖18所示。圖17 在CXXXDoc類中增加成員函數(shù)圖18 增加DrawText函數(shù)實(shí)現(xiàn)CXXXDoc類中的DrawText函數(shù),如下所示。void CSDIDoc:DrawText(CDC *pDC)TEXTMETRIC tm; CString str;int line=0;pDC-GetTextMetrics(&tm);int nLineHeight=tm.tmHeight+tm.tmExternalLeading; POSITION pos=m_strList.GetHeadPosition();for(;pos!=NULL;m_strList.GetNex

溫馨提示

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