實(shí)驗(yàn)4單文檔和多文檔窗口_第1頁(yè)
實(shí)驗(yàn)4單文檔和多文檔窗口_第2頁(yè)
實(shí)驗(yàn)4單文檔和多文檔窗口_第3頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn) 4 單文檔和多文檔窗口一 實(shí)驗(yàn)?zāi)康恼莆绽瞄_發(fā)平臺(tái)創(chuàng)建單文檔和多文檔窗口方法掌握在窗口中輸出文字、圖形的方法及 MFC 中相關(guān)類的使用二 實(shí)驗(yàn)要求1創(chuàng)建一個(gè)單文檔窗口,在文檔類定義一個(gè)整型變量,其取值范圍從01000循環(huán),在視圖的中間顯示該數(shù)字,當(dāng)用戶點(diǎn)擊窗口的不同區(qū)域時(shí),變量值按不同的增量增加并顯示。提示:在修改數(shù)據(jù)后,使用 Invalidate() 函數(shù)引起 MFC 對(duì) OnDraw() 的調(diào)用,這樣就可 以用修改后的數(shù)據(jù)進(jìn)行畫圖了。關(guān)于對(duì)文檔類的訪問(wèn),見(jiàn)本實(shí)驗(yàn)的技術(shù)支持。2 創(chuàng)建一個(gè)單文檔窗口, 鼠標(biāo)在窗口上單擊后在鼠標(biāo)的位置顯示一正方形, 點(diǎn)擊 20 次后清 窗口, 新的點(diǎn)擊將不

2、再增加新的正方形, 而是將已輸入的正方形在原位置顯示,當(dāng)然, 在每 20 單擊后要重新清窗口。(要求用 MFC 的通用類保存單擊的信息,如 CList 類)知識(shí)點(diǎn):畫線當(dāng)單擊鼠標(biāo)左鍵時(shí), 就可以獲得一個(gè)點(diǎn), 即線條的起點(diǎn)。 接著按住鼠標(biāo)左鍵并拖 動(dòng)一段距離后松開鼠標(biāo),此時(shí)也可以獲得一個(gè)點(diǎn),即線條的終點(diǎn)。也就是說(shuō),我 們需要捕獲兩個(gè)消息,一個(gè)是鼠標(biāo)左鍵按下消息( WM_LBUTTOND)VV在該消息 響應(yīng)函數(shù)中可以獲得將要繪制的線條的起點(diǎn);另一個(gè)是鼠標(biāo)左鍵彈起來(lái)的消息(WM_LBUTTONUP在該消息響應(yīng)函數(shù)中可以獲得將要繪制的線條的終點(diǎn)。有了這兩個(gè)點(diǎn)就可以繪制出一條線。利用 SDK 全局函數(shù)實(shí)

3、現(xiàn)畫線功能為了進(jìn)行繪圖操作,必須獲得一個(gè)設(shè)備描述表(DC ),因此,首先定義一個(gè) HDC 類型的變量:hdc,接著調(diào)用全局函數(shù) GetDC獲得當(dāng)前窗口的設(shè)備描述表。因?yàn)?CWnd類有一個(gè)成員變量( m_hWnd ),而 CView 類派生于 CWnd 類,因此該類也有這樣的一個(gè)成員變用于 保存窗口句柄,而 GetDC 函數(shù)可以直接把這個(gè)成員變量作為參數(shù)來(lái)使用。利用 MFC 的 CDC 類實(shí)現(xiàn)畫線功能該類提供一個(gè)數(shù)據(jù)成員 m_hDC 類用來(lái)保存與 CDC 相關(guān)的 DC 句柄。其道理與 CWnd 類提供成員變量 m_hWnd 保存與窗口相關(guān)的窗口句柄是一樣的。CDC* pDC = GetDC();

4、pDC->MoveTo(m_ptOriginal);pDC->LineTo(point);ReleaseDC(pDC);利用 MFC 的 CClientDC 類實(shí)現(xiàn)畫線功能利用 MFC 提供的 CClientDC 類來(lái)實(shí)現(xiàn)畫線的方法。這個(gè)類派生于 CDC 類,并且在構(gòu) 造時(shí)調(diào)用 GetDC 函數(shù),在析構(gòu)時(shí)調(diào)用 ReleaseDC 函數(shù)。也就是說(shuō),當(dāng)一個(gè) CclientDC 對(duì)象 在構(gòu)造時(shí)會(huì)調(diào)用 GetDC 函數(shù),獲得一個(gè)設(shè)備描述表對(duì)象;對(duì)象析構(gòu)時(shí),會(huì)自動(dòng)釋放這個(gè)設(shè) 備描述表資源。這樣的話,程序中只需要定義一個(gè) CclientDC 對(duì)象,就是利用該對(duì)象提供的 函數(shù)進(jìn)行繪圖操作了。當(dāng)該

5、對(duì)象的生命周期結(jié)束時(shí),會(huì)自動(dòng)釋放其所占用的設(shè)備資源。CClientDC dc(this);dc.MoveTo(m_ptOriginal);dc.LineTo(point);為了在視圖之外的框架上畫圖,將第一句改為 CClientDC dc(GetParent(); ,結(jié)果發(fā)現(xiàn)線 條可以畫到工具欄上面了。繪制彩色線條CPen pen(PS_SOLID,1,RGB(255, 0, 0);/畫筆為實(shí)線、線寬為 1、紅色。點(diǎn)線設(shè)為 PS_DOT ,虛線為 PS_DASHCClientDC dc(this);Cpen* pOldPen = dc.SelectObject(&pen);/ Sele

6、ctObject 函數(shù)實(shí)現(xiàn)將 GDI 對(duì)象選入設(shè)備描述符中, 并且返回原先被選對(duì)象的指針 dc.MoveTo(m_ptOriginal);dc.LineTo(point);dc.SelectObject(pOldPen);/ 恢復(fù)原畫筆3 在一個(gè)單文檔窗口中,當(dāng)鼠標(biāo)在窗口中移動(dòng)并按下左鍵時(shí)畫圖,左鍵彈起時(shí)停止4 創(chuàng)建一個(gè) MDI 窗口,讀入一個(gè)數(shù)據(jù)文件,然后用不同的方式在不同的窗口上顯示。三 實(shí)驗(yàn)過(guò)程4.1創(chuàng)建一個(gè)單文檔窗口,在文檔類定義一個(gè)整型變量,其取值范圍從01000循環(huán),在視圖的中間顯示該數(shù)字, 當(dāng)用戶點(diǎn)擊窗口的不同區(qū)域時(shí), 變量值按不同的增量增加并顯示。提示:在修改數(shù)據(jù)后,使用 In

7、validate() 函數(shù)引起 MFC 對(duì) OnDraw() 的調(diào)用,這樣就可 以用修改后的數(shù)據(jù)進(jìn)行畫圖了。目標(biāo):掌握運(yùn)用 Appwizard 創(chuàng)建一個(gè)應(yīng)用程序, 熟悉 CApp1Doc 文檔類和 CApp1View 視圖 類,掌握視圖類的 OnDraw() 的調(diào)用和文檔類中的數(shù)據(jù)處理步驟:1 使用 AppWizard 創(chuàng)建一個(gè)應(yīng)用程序創(chuàng)建一個(gè) MFC 單文檔應(yīng)用程序1) 單擊 Developer Studio 的 File (文件)菜單中的 New (新建)命令,以顯示 New 對(duì)話框,選 擇 MFC( AppWizard (exe) ,然后輸入需要?jiǎng)?chuàng)建工程的名稱和目錄(見(jiàn)圖 4-1)。注意

8、,幾乎在所有的工程文件的內(nèi)部和外部都使用該名字,因此,此處的任何錯(cuò)誤在以后都是很 難改正的。選擇MFCAppWizardfexe)nn輸入項(xiàng)目的名字和日錄圖4-1指定應(yīng)用程序的文件名和位置2)AppWizard的第一步是選擇應(yīng)用程序的類型(見(jiàn)圖4-2 ),選擇單文檔選項(xiàng)。選擇悶用 程序類型圖4-2選擇應(yīng)用程序類型3) AppWizard的第二步要求指定應(yīng)用程序所需要的數(shù)據(jù)庫(kù)支持種類。選擇Header FilesOnly (只有頭文件)使AppWizard只添加支持?jǐn)?shù)據(jù)庫(kù)訪問(wèn)的MFC類。因此,訪問(wèn)一個(gè) ODBC或DAO數(shù)據(jù)庫(kù),選擇 Database View without File Suppo

9、rt(數(shù)據(jù)庫(kù)視圖,沒(méi)有文件支持)或者Database View With File Support(數(shù)據(jù)庫(kù)支持,具有文件支持)使AppWizard創(chuàng)建一個(gè)具有特殊的視圖和文檔類的簡(jiǎn)單的數(shù)據(jù)庫(kù)編輯器。如果選擇 Database View without FileSupport ,AppWizard將不添加標(biāo)準(zhǔn)文件打開命令到應(yīng)用程序菜單(即:File /New, File/Open等)。從理論上講,如果只訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),無(wú)論如何也不需這些命令,當(dāng)應(yīng)用程序開始運(yùn)行時(shí),合適的數(shù)據(jù)庫(kù)將被自動(dòng)打開。然而,如果應(yīng)用程序既要訪問(wèn)平面文件,又要訪問(wèn)數(shù)據(jù)庫(kù)文件,則應(yīng)該選擇 Database View with F

10、ile Support 。4) AppWizard的第三步要求指定應(yīng)用程序所需要的C O M支持。本實(shí)驗(yàn)只采用了默 認(rèn)選項(xiàng)。5)AppWizard的第四步要求選擇一些基本的應(yīng)用程序選項(xiàng)(見(jiàn)圖4- 3 ),可以選擇應(yīng)用程序是否有一個(gè)工具欄或狀態(tài),是否添加打印命令到菜單,以及是否包括支持e-mail或網(wǎng)絡(luò)通信。Recent File list(當(dāng)前文件列表)是應(yīng)用程序打開的最近幾個(gè)文件的一個(gè)列表,它由應(yīng)用程序自動(dòng)維護(hù),用戶必須決定這里的n是多少。單擊 Advaneed (高級(jí))按鈕進(jìn)行更高級(jí)的選項(xiàng)設(shè)置(本實(shí)驗(yàn)采用默認(rèn)選項(xiàng))。隴擇簡(jiǎn)單的血用理序選項(xiàng)然后編輯將在 文件對(duì)話中顯 示的過(guò)濾名了圖4-3選擇

11、應(yīng)用程序選項(xiàng)6)高級(jí)選項(xiàng)的第一頁(yè)要選擇將在應(yīng)用程序標(biāo)題欄中顯示的標(biāo)題。如果創(chuàng)建一個(gè)串行化它 的文檔到磁盤的應(yīng)用程序,則可以選擇應(yīng)用程序追加給那些文件的文件擴(kuò)展名,然后就可以在打開或保存文檔時(shí)顯示的文件對(duì)話框的過(guò)濾域中編輯文本(見(jiàn)圖4 -4 )(本實(shí)驗(yàn)采用默認(rèn)選項(xiàng))。輸入應(yīng)用程 序創(chuàng)建的文 檔的三個(gè)字 母擴(kuò)展名圖4-4指定應(yīng)用程序標(biāo)題、缺省文件擴(kuò)展名和文件對(duì)話文本7)高級(jí)選項(xiàng)的第二頁(yè)要求在應(yīng)用程序中添加視圖分割(Splitting )能力,它將提供允許動(dòng)態(tài)分割他們的視圖的一個(gè)菜單命令。也可以決定是否要求應(yīng)用程序主窗口或子窗口初始最大化或初始最小化,以及用戶是否能夠重調(diào)它們的大?。ㄒ?jiàn)圖4- 5)(

12、本實(shí)驗(yàn)采用默認(rèn)選項(xiàng))cAdvarttsd Qp-l*ontm-BW- »*- M 8»» i!S -廠I曲SfilU : . iJ = iia* * BL._MI: . K J.'輸入高級(jí)應(yīng) 用程序選頊17 Mr i nut: Liisi戸加說(shuō)m m*r:u f* Mm nutd 廠 M j»itudMD <Wd Pbh'fr 腳應(yīng)時(shí) F liJi JhiE舟bowM n r»Ed療 Ma- riie tow Mreed圖4-5:指定應(yīng)用程序的框架窗口選項(xiàng)8)在AppWizard的第五步,必須決定是用MFC庫(kù)靜態(tài)鏈接,還是

13、用一個(gè)共享的MFC DLL進(jìn)行鏈接(見(jiàn)圖4 - 6 )。靜態(tài)鏈接MFC庫(kù)使應(yīng)用程序相當(dāng)龐大,但用戶從來(lái)不必考慮正確版 本的MFC DLL當(dāng)前是否已經(jīng)安裝在系統(tǒng)上。如果計(jì)劃用MFC庫(kù)創(chuàng)建自己的 DLL,則必須鏈接MFC DLL 。(本實(shí)驗(yàn)采用默認(rèn)選項(xiàng))選擇是慨態(tài)鏈 接MFC還是與 其他應(yīng)用程序 共亨它的DLL圖4-6選擇怎樣鏈接MFC9)AppWizard的最后一步,允許改變應(yīng)用程序的視圖類。關(guān)于選項(xiàng)的描述。對(duì)于沒(méi)有列出的任何視圖類,選擇缺省視圖類一可以在以后編輯名字(見(jiàn)圖4-7 )。(本實(shí)驗(yàn)采用默認(rèn)選項(xiàng))選定視圖類文件wFC AwWiriiri- Slct Gof SC.-/a*ppCMarF

14、iSTji: 任hfcFi長(zhǎng) i 口吩57 gmIddUMS CFa林g iL_rtl'Xe.«j L-t IT'Hli.hf iJhpWT 毋 cr<JVuwAppVikfld ce«*53 hebhing 云鄒:?$ 才卅匚選樣件地 選擇一個(gè) 不同的視 関類圖4-7選擇一個(gè)視圖類.10) 編譯連接后,產(chǎn)生的默認(rèn)的單文檔應(yīng)用程序(圖4-8)圖4-8 個(gè)單文檔應(yīng)用程序2.在文檔類定義一個(gè)變量 m_value,在視圖類里面給添加命令響應(yīng)函數(shù) On LButto nDow n(UINT nFlags, CPoi nt poi nt),用于捕捉鼠標(biāo)點(diǎn)擊位置,

15、作為變量值。具體代 碼添加如下:在文檔類頭文件中/ Impleme ntati onpublic:int m_value; /添加整形變量名virtual CSy41Doc();在構(gòu)造函數(shù)初始化 m_valueCSy41Doc:CSy41Doc()/ TODO: add one-time construction code herem_value=0; 在視圖類添加的整形變量x, y,布爾變量 m_bCaptured在視圖類頭文件中/ Implementationpublic:int y;int x;bool m_bCaptured;virtual CSy41View(); 在構(gòu)造函數(shù)中初始化

16、變量 CSy41View:CSy41View() / TODO: add construction code herex=0;y=0;m_bCaptured=false;在鼠標(biāo)響應(yīng)函數(shù) OnLButtonDown(UINT nFlags, CPoint point) 中添加 void CSy41View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/SetCapture(); m_bCaptured=true;x=point.x;y=

17、point.y;Invalidate(m_bCaptured); / 進(jìn)行操作的更新CView:OnLButtonDown(nFlags, point); 在 OnDraw(CDC* pDC )中添加void CSy41View:OnDraw(CDC* pDC)CSy41Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/pDoc->m_value=(x+pDoc->m_value)%1000;CString m_str;m_str.Format("

18、%4d", pDoc->m_value);pDC->TextOut(x,y,m_str);4.2 創(chuàng)建一個(gè)單文檔窗口, 鼠標(biāo)在窗口上單擊后在鼠標(biāo)的位置顯示正方形, 點(diǎn)擊 20 次后清窗 口,新的點(diǎn)擊將不再增加新的正方形, 而是將已輸入的正方形在原位置顯示, 當(dāng)然, 在每 20 單擊后要重新清窗口。 (要求用 MFC 的通用類保存單擊的信息,如 CList 類) 目標(biāo):熟悉視圖類文件的 OnDraw ()函數(shù),掌握鼠標(biāo)消息映射函數(shù)實(shí)現(xiàn)人機(jī)界面功能。 步驟:1 如實(shí)驗(yàn) 4.1 創(chuàng)建一個(gè)單文檔窗口,在視圖類里面添加兩個(gè)成員變量,整形變量count 用于記錄鼠標(biāo)點(diǎn)擊次數(shù), 布爾變

19、量 m_bCaptured 用于判斷鼠標(biāo)的點(diǎn)擊, 添加一個(gè) CRect 類的對(duì) 象 m_boxShape 。添加成員函數(shù)鼠標(biāo)消息映射函數(shù)OnLButtonDown(UINT nFlags, CPointpoint) 。具體的程序清單如下。在視圖類頭文件中添加成員變量/ Implementationpublic:int m_count;CRect m_boxShape;bool m_bCaptured;初始化成員變量在 CSy42View:CSy42View()CSy42View:CSy42View()/ TODO: add construction code herem_bCaptured=f

20、alse;m_count=0;在鼠標(biāo)消息映射函數(shù) OnLButtonDown(UINT nFlags, CPoint point) 添加: void CSy42View:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default/SetCapture(); m_bCaptured=true;if(m_bCaptured)m_count+=1; if(m_count%20 != NULL)m_boxShape.left=point.x; m_boxSh

21、ape.right=point.x+100;m_boxShape.top=point.y; m_boxShape.bottom=point.y+100;else m_boxShape.left=0; m_boxShape.right=0; m_boxShape.top=0; m_boxShape.bottom=0; m_count=0;Invalidate(true);m_bCaptured=false;CView:OnLButtonDown(nFlags, point);在 OnDraw(CDC* pDC) 函數(shù)中添加void CSy42View:OnDraw(CDC* pDC)CSy42D

22、oc* pDoc = GetDocument(); ASSERT_VALID(pDoc);/ TODO: add draw code for native data here pDC->Rectangle(m_boxShape);4.3 在一個(gè)單文檔窗口中,當(dāng)鼠標(biāo)在窗口中移動(dòng)并按下左鍵時(shí)畫圖,左鍵彈起時(shí)停止目標(biāo):熟悉使用鼠標(biāo)進(jìn)行畫圖,并且選擇不同的畫筆。步驟:1按照實(shí)驗(yàn) 4.1 創(chuàng)建一個(gè)單文檔窗口,然后在視圖類頭文件中 sy43View.h 添加 ShpType 集合類型和結(jié)構(gòu)體 Shape 結(jié)構(gòu)以及常量 SHPS_MAX=1000;enum ShpType / 可以添加其他圖形shpR

23、ectangle;struct ShapeCRect m_boxShape;ShpType m_typeshape;const int SHPS_MAX=1000;2在視圖類頭文件 sy43View.h 中添加數(shù)據(jù)成員到公共屬性區(qū), 并且在文件 sy43View.cpp 的 視圖類構(gòu)造器 CSy43View:CSy43View() 初始化成員變量public:ShpType m_TypeNext;Shape m_shpTemp;Shape m_arShpsSHPS_MAX;int m_countShapes;bool m_bCapture;CBrush * m_pBrush01d;ShpTyp

24、e m_typeshape;/ CSy43View:CSy43View()/ TODO: add construction code here srand(unsigned) time(NULL); m_TypeNext=shpRectangle;m_bCapture=false;m_pBrush01d=NULL;m_countShapes=0;3在視圖的 OnDraw 函數(shù)添加如下代碼,采用一個(gè) for 循環(huán)砸在數(shù)組 m_arShps 繪出所有圖 形。void CSy43View:OnDraw(CDC* pDC)CSy43Doc* pDoc = GetDocument();ASSERT_VA

25、LID(pDoc);/ TODO: add draw code for native data hereSetPenBrush(pDC);for (int nShp=0; nShp<m_countShapes; nShp+)ASSERT(m_arShpsnShp.m_typeshape=shpRectangle); pDC->Rectangle(m_arShpsnShp.m_boxShape);ResetPenBrush (pDC);函數(shù)說(shuō)明,首先調(diào)一個(gè) SetPenBrush 函數(shù)改變 OnDraw 函數(shù)的設(shè)備描述表,在程序結(jié)束后, 調(diào)用一個(gè)對(duì)應(yīng) ResetPenBrush 函數(shù)

26、回復(fù)以前的設(shè)備描述表屬性。4給鼠標(biāo)消息添加消息函數(shù),首先是OnLButtonDown 消息處理函數(shù)中,添加如下代碼void CSy43View:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default /SetCapture();m_bCapture=true;ASSERT(m_TypeNext=shpRectangle);CView:OnLButtonDown(nFlags, point);接著在 OnMouseMove 消息處理函數(shù)中添加voi

27、d CSy43View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(m_bCapture)CView:OnMouseMove(nFlags, point);最后在 OnLButtonUp 消息處理函數(shù)中,添加void CSy43View:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defa

28、ult if(m_bCapture):ReleaseCapture(); m_bCapture=false; CClientDC dc(this);InvertShape(&dc,m_shpTemp,false); m_arShpsm_countShapes=m_shpTemp; m_countShapes+;CView:OnLButtonUp(nFlags, point);5.添加繪圖輔助函數(shù),在 sy43View.cpp文件中添加函數(shù) SetPenBrush,添加如下代碼 void CSy43View:SetPenBrush(CDC *pDC)ASSERT(pDC !=NULL);

29、 m_pBrush01d=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);接著添加 ResetPenBrush 函數(shù),添加如下代碼void CSy43View:ResetPenBrush(CDC *pDC)ASSERT(pDC !=NULL);ASSERT( m_pBrush01d !=NULL); m_pBrush01d=(CBrush*)pDC->SelectStockObject(NULL_BRUSH); m_pBrush01d=NULL;最后添加 InvertShape 函數(shù),添加代碼如下:void CSy43View:InvertS

30、hape(CDC *pDC, Shape &s, bool bInvert)ASSERT(pDC !=NULL);int nMode01d;if(bInvert) nMode01d=pDC->SetROP2(R2_NOT);SetPenBrush(pDC);shpRectangle: pDC->Rectangle(s.m_boxShape); if(bInvert) pDC->SetROP2(nMode01d);ResetPenBrush(pDC);其中, InvertShape 函數(shù)是將繪圖和擦除動(dòng)作合成在一起。4.4 創(chuàng)建一個(gè) MDI 窗口,讀入一個(gè)數(shù)據(jù)文件,然后

31、用不同的方式在不同的窗口上顯示。 目標(biāo):熟悉多文檔窗口的創(chuàng)建,掌握在不同的窗口中用不同的方式顯示數(shù)據(jù)文件。步驟:1 按照實(shí)驗(yàn) 4.1 的創(chuàng)建一個(gè)多文檔窗口,如圖4-2,選擇多文檔選項(xiàng)。2在 CChildFrame 添加一個(gè)基于 CSplitterWnd 類成員變量 m_wndSplitter ,同時(shí)添加一個(gè)成 員函數(shù) OnCreateClient( LPCREATESTRUCT lpcs ,CCreateContext* pContext) ,添加代碼如下: BOOL CChildFrame:OnCreateClient( LPCREATESTRUCT lpcs,CCreateContext*

32、 pContext) if(!m_wndSplitter.CreateStatic(this,1,2)|!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CStatView1),CSize(165,0),pContext)|!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CStatView2),CSize(0,0),pContext) return false;return true;我們調(diào)用 3 個(gè)函數(shù):一個(gè) m_wndSplitter.CreateStatic ,兩個(gè) m_wndSplitter.CreateVi

33、ew 。如 果其中一個(gè)調(diào)用失敗,講返回false,應(yīng)用程序中止運(yùn)行。函數(shù)CreateStatic采用一個(gè)參數(shù)來(lái)標(biāo)識(shí)它的父窗口,2個(gè)參數(shù)用來(lái)設(shè)置行數(shù)和列數(shù)(在實(shí)例中是 1 行 2 列),創(chuàng)建初始化靜態(tài)分割窗口。對(duì)于靜態(tài)分割窗口,我們用 CreateView 函數(shù) 設(shè)置窗口的視圖類,前兩個(gè)參數(shù)用于設(shè)置窗口的行數(shù)和列數(shù),采用0、 0 使窗口具有 1 行 2列(兩個(gè)窗口左右并列) ;在第二個(gè) CreateView 函數(shù)調(diào)用中, 采用參數(shù) 0、1。每一個(gè) CreatView 函數(shù)調(diào)用傳遞一個(gè) CRuntimeClass 對(duì)象,可由 RUNTIME_CLASS 宏獲得,傳遞該對(duì)象,用 于標(biāo)識(shí) MFC 創(chuàng)建

34、視圖對(duì)像所需的視圖類。在上面的列子中,我們?yōu)樽笥覂蓚€(gè)窗口分別設(shè)置為C View的派生類CStatViewl和CStatView2。 CSize變量用于設(shè)置兩個(gè)窗口的寬度。在本 實(shí)例中調(diào)用 CSize( 165, 0),采用 CSize( 0, 0)用來(lái)設(shè)置右邊窗口占用左邊窗口所剩余的 水平空間。3. 在文檔類定義兩個(gè)成員變量,整型變量m_value,字符串變量 m_stri ng,初始化為: CSy44Doc:CSy44Doc()/ TODO: add one-time construction code herem_String="Hello World!"m_Value

35、=582;4. 創(chuàng)建兩個(gè) CView 的派生類 CStatView1 和 CStatView2 。采用 insert 中 new class 命令添加。 在新創(chuàng)建的兩個(gè)類的 OnDraw(CDC* pDC) 函數(shù)里面添加如下代碼:void CStatView1:OnDraw(CDC* pDC)CSy44Doc* pDoc =(CSy44Doc*) GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code here pDC->TextOut(10,10,pDoc->m_String);void CStatView2:OnDraw(C

36、DC* pDC)CSy44Doc* pDoc = (CSy44Doc*)GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code hereCString x;x.Format("%4d",pDoc->m_Value); pDC->TextOut(10,10,x); 數(shù)據(jù)文件分別顯示在不同的窗口里面。四 技術(shù)支持. Single DocumentInterface(SDI ,單文檔界面 ) 這種類型的應(yīng)用程序一次 只允許打開個(gè)文檔。 文檔自動(dòng)充滿應(yīng)用程序的主窗口, 不為其他的文檔留下空 間。 Windows 的

37、NotePad 程序是一個(gè) SDl 應(yīng)用程序。 Multiple Document Interface (MDI,多文檔界面 ) 這種類型的應(yīng)用程序允許同時(shí)打開多個(gè)文檔。我們非常熟悉的 Word 就屬于 MDI 應(yīng)用程序。究竟何時(shí)選擇 SDI 和 MDI ?如果在運(yùn)行期間應(yīng)用程序只與一個(gè)文檔有關(guān)連, 那 么就使用 SDI 方法。但是,如果應(yīng)用程序能產(chǎn)生多個(gè)文檔,并對(duì)多個(gè)文檔進(jìn)行 處理( 即使這不是一次性完成的 ) ,這時(shí)應(yīng)該采取 MDI 的方法,即使在開始時(shí)并 沒(méi)有看到在同一時(shí)間修改多個(gè)文檔的可能。一個(gè) MDI 應(yīng)用程序并不比一個(gè) SDI 應(yīng)用程序復(fù)雜多少,卻可以帶給用戶在同一時(shí)間看閱多個(gè)文檔

38、的方便。如果不特別說(shuō)明,MFC應(yīng)用程序使用編程的模板將數(shù)據(jù)和數(shù)據(jù)顯示分離開,將數(shù) 據(jù)與用戶對(duì)數(shù)據(jù)的交互分離開。在這種模型下,MFC文檔對(duì)象讀寫數(shù)據(jù),提供與 數(shù)據(jù)的接口。 個(gè)獨(dú)立的視圖對(duì)象管理數(shù)據(jù)的顯示, 為窗口提供數(shù)據(jù)公用及用戶 對(duì)數(shù)據(jù)的選擇、編輯。視圖對(duì)象從文檔獲取數(shù)據(jù),將數(shù)據(jù)的變化傳回文檔。盡管用戶可以忽略文檔和視圖的分離,但是,遵循這種模型是有原因的。第一, 當(dāng)用戶需要同一個(gè)文檔的多個(gè)視時(shí) ( 如表格和圖表視圖 ),由于對(duì)所有視圖的公用 代碼存在文檔中, 文檔視圖結(jié)構(gòu)使一個(gè)單獨(dú)的視圖對(duì)象代表了數(shù)據(jù)的每一個(gè)視 圖。當(dāng)數(shù)據(jù)變化時(shí),文檔將更新所有的視圖對(duì)象。MFC的文檔/視圖結(jié)構(gòu)支持多視圖,多

39、文檔類型,切分窗口和其他用戶接口特性。 文檔視圖結(jié)構(gòu)的核心是以下四個(gè)類: CDocument或COIeDocument)用于存儲(chǔ)和控制程序數(shù)據(jù)的對(duì)象; CView ( 或派生類) 用于顯示文檔數(shù)據(jù)和管理用戶與數(shù)據(jù)的交互; CFrameWnd提供文檔的一個(gè)或多個(gè)視圖的框架; CDocTempIate ( 或 CSingIeDocTemptate 、CMuItiDocTempIate) 協(xié)調(diào)給定類 型的一個(gè)或幾個(gè)文檔,并管理創(chuàng)建文檔、視圖和框架窗口對(duì)象。文檔和視圖在一個(gè)典型的 MFC 應(yīng)用程序中是成對(duì)出現(xiàn)的。數(shù)據(jù)存放在文檔中, 而視圖對(duì)這些數(shù)據(jù)有訪問(wèn)優(yōu)先權(quán)。 文檔與視圖的分離將數(shù)據(jù)的存儲(chǔ)和維護(hù)與它

40、的 顯示分離開來(lái):從視圖中訪問(wèn)文檔數(shù)據(jù)從視圖中訪問(wèn)文檔數(shù)據(jù)有兩種方式,一種是使用 GetDocumemt函數(shù),返回一個(gè)指向文檔的指針,另一種就是使視圖類成為文檔類 的友元。用戶輸入到視圖現(xiàn)將鼠標(biāo)單擊解釋為選擇或編輯數(shù)據(jù), 同樣,將鍵盤輸入認(rèn)為是 數(shù)據(jù)的輸入或編輯。 假設(shè)用戶在視圖中輸入一個(gè)字符串,視圖將獲得到文檔的 指針并使用指針將新的數(shù)據(jù)化送到文檔中,以某種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)起來(lái)。更新同一文檔的多個(gè)視圖在一個(gè)帶有多個(gè)視圖的應(yīng)用中, 如文本編輯器的切分窗 口,視圖首先將新數(shù)據(jù)傳到文檔中, 然后調(diào)用文檔的 UpdateAllViews 成員函數(shù), 通知文檔所有的視圖進(jìn)行更新。視圖的其他成員函數(shù)處理和解

41、釋所有用戶的輸入, 用戶通常在視圖類中定義消息 處理函數(shù),以便處理以下內(nèi)容: Windows 消息,由鼠標(biāo)和鍵盤操作產(chǎn)生; 來(lái)自菜單、工具條按鈕和加速鍵產(chǎn)生的命令。視圖所處理的消息依賴于應(yīng)用 程序。在前面的消息處理和映射一節(jié)中已解釋了怎樣將菜單項(xiàng)和其他用戶界面控 制與命令相連。經(jīng)常使用的有 7 個(gè)重要的 CDocument 函數(shù)。這些函數(shù)分為三類: 訪問(wèn)視圖的函 數(shù)、與文檔信息相關(guān)的函數(shù)、與修改狀態(tài)有關(guān)的函數(shù)。?對(duì)視圖的訪問(wèn)一一CDocument類提供了三個(gè)函數(shù)使得對(duì)附屬在文檔上的 視圖更容易使用 由于一個(gè)文檔可以有多個(gè)視圖,但每個(gè)視圖只能有一個(gè) 文檔。所以可以通過(guò)調(diào)用 GetFirstVie

42、w() 函數(shù)來(lái)獲取一個(gè)附屬在文檔上 的視圖。如果有多個(gè)視圖存在的話, 則可以調(diào)用 GetNextView() 直到返回 值為NULL=文檔不時(shí)地改變某些數(shù)據(jù)并需要通知其所有的視圖進(jìn)行更新, UpdateAllViews(NULL) 函數(shù)便是為此目的而設(shè)計(jì)的。? 文檔信息 GetPathName() 和 GetTitle() 這兩個(gè)函數(shù)可以使文檔找 到其所連接的文件。 GetPathName() 返回的是文檔的完全路徑,而 GetTitle() 返回的是文檔的標(biāo)題,通常與其文件名有關(guān)。如果一個(gè)新的 文檔還從沒(méi)有被保存過(guò),那么該函數(shù)的返回值使是NULL。? 修改狀態(tài) CDocument 類有兩個(gè)函

43、數(shù)使你可以監(jiān)視自文檔上次被保存 以來(lái)文檔是否被修改過(guò)。 如果數(shù)據(jù)被改變了, 那么 IsModified() 函數(shù)返 回非零值, 但是,要使之發(fā)揮作用, 每個(gè)改變文檔數(shù)據(jù)的函數(shù)必須在它改 變數(shù)據(jù)時(shí)調(diào)用 SetModifiedFlag() 函數(shù)。創(chuàng)建窗口類型的選擇使用開發(fā)平臺(tái)中的 AppWizard 可以自動(dòng)創(chuàng)建三種類型的 MFC 應(yīng)用程序窗口:對(duì) 話框、單文檔界面或多文檔界面。對(duì)窗口類型的選擇可基于以下幾點(diǎn)考慮:如果創(chuàng)建一個(gè)用戶界面需求有限的應(yīng)用程序, 或如果想界面完全單一, 那么就 創(chuàng)建一個(gè)對(duì)話框應(yīng)用程序。典型的對(duì)話框應(yīng)用程序包括配置硬件設(shè)備的應(yīng)用程 序、屏幕保護(hù)程序和游戲程序等。如果應(yīng)用程序

44、要編輯一個(gè)文檔, 應(yīng)該選擇另外兩種應(yīng)用程序類型。 這里的“編 輯一個(gè)文檔”是廣義上的意思, 所指的文檔可以是一個(gè)文本文件、 電子數(shù)據(jù)表文 件、第三方數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)表、 或者是自己的二進(jìn)制文件, 甚至可以是大量 硬件設(shè)備的儲(chǔ)存設(shè)置。 編輯僅僅表示對(duì)其中任何一個(gè)類型的文檔進(jìn)行添加、 刪除 或修改操作。單文檔界面應(yīng)用程序一次只允許處理一個(gè)文檔。 如果應(yīng)用程序?qū)嶋H上一次只需 處理一個(gè)文檔,諸如監(jiān)視一組硬件設(shè)備的應(yīng)用程序,那么應(yīng)該選擇單文檔界面; 否則應(yīng)該創(chuàng)建一個(gè)多文檔界面應(yīng)用程序, 即使在開始時(shí)一次編輯多個(gè)文檔并未顯 出有任何好處。一個(gè)多文檔界面應(yīng)用程序允許一次編輯多個(gè)文檔, 它并不比一個(gè)單文檔界

45、面應(yīng) 用程序復(fù)雜,但卻帶來(lái)了一次至少查看多個(gè)文檔的方便。選擇視圖的類型單文檔或多文檔界面應(yīng)用程序, 在退出 AppWizard 之前必須選擇所需的視圖類, 在 AppWizard 的最后一步,可以選擇下面視圖類:對(duì)于一個(gè)簡(jiǎn)單的文本編輯器應(yīng)用程序,選擇 CEditView 。 對(duì)于一個(gè)能編輯多信息文本格式 ( RTF) 文件的應(yīng)用程序,選擇 CRichEditView( 這一選擇將導(dǎo)致應(yīng)用程序?yàn)槲臋n類選擇 CRichEditDoc 類) 。 對(duì)于一個(gè)圖形應(yīng)用程序,選擇 CScrollView 。對(duì)于一個(gè)簡(jiǎn)單的監(jiān)控或帳目管理應(yīng)用程序,選擇 CListView 。 要著手創(chuàng)建一個(gè)資源管理器類型的應(yīng)用

46、程序, 請(qǐng)選擇 CTreeView ( 在以后的步 驟中, 可以手工添加一個(gè) CListView ) 。在對(duì)話框模板外創(chuàng)建一個(gè)視圖, 選擇 CFormView ( 一個(gè)對(duì)話框是一個(gè)被幾個(gè)控 件窗口占據(jù)的窗口,諸如按鈕和編輯框 ) 。對(duì)于一些特殊用途,也可以在 AppWizard 的早期階段為視圖類間接地選擇 CRecordView 或 CDaoRecordView ,同時(shí)在該階段還得決定為應(yīng)用程序添加什么 樣的數(shù)據(jù)庫(kù)支持。如果在第二步中選擇任何一項(xiàng)“ DataBase View ”選項(xiàng),則該視圖被添加,并允許輕松地訪問(wèn)一個(gè) ODBC或DAO數(shù)據(jù)庫(kù)中的記錄。選擇文檔類型 應(yīng)用程序可以與三種基本文檔類型進(jìn)行交互:平面文件 (flat file) 、串行文件或數(shù)據(jù)庫(kù)。通常,文檔類型的選擇取決于用戶打算編寫的應(yīng)用 程序類型,讓我們討論怎樣選擇:一個(gè)平面二進(jìn)制或文本文件是應(yīng)用程序可以支持的最簡(jiǎn)單的文檔, 并且

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論