版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第16講單文檔應(yīng)用程序的結(jié)構(gòu)基于MFC進(jìn)行應(yīng)用開發(fā)使用VC++的應(yīng)用程序向?qū)FCAppWizard可以開發(fā):單文檔Singledocument
多文檔Multipledocument對話框Dialogbased三種類型的應(yīng)用程序。本講開始學(xué)習(xí)單文檔應(yīng)用程序的開發(fā)技術(shù)2單文檔應(yīng)用案例1的程序運(yùn)行界面3本講主要內(nèi)容利用向?qū)Ы⒁粋€(gè)單文檔應(yīng)用程序框架向?qū)傻暮诵念惣捌涔δ芪臋n/視圖文字的顯示菜單4單文檔案例1——文本顯示案例利用MFC建立一個(gè)單文檔應(yīng)用程序,用于在客戶區(qū)顯示文本。程序的主要功能包括:使用菜單命令按照指定文本內(nèi)容和坐標(biāo)位置在客戶區(qū)顯示文本保存文本內(nèi)容等。5利用向?qū)Ы⒁粋€(gè)單文檔應(yīng)用程序框架【例9-1】利用MFCAppWizard[exe]向?qū)梢粋€(gè)SDI單文檔應(yīng)用程序MyTextOut。6【編程步驟】(1)在VisualC++IDE中執(zhí)行File|New命令,打開New對話框。在項(xiàng)目類型列表框中選擇MFCAppWizard[exe]項(xiàng),在Projectname框中輸入項(xiàng)目名稱,本例為MyTextOut。選擇好合適的路徑。(2)在MFCAppWizard-Step1對話框中選擇Singledocument項(xiàng),向?qū)?chuàng)建一個(gè)單文檔應(yīng)用程序框架,在本例中,以下的各個(gè)步驟使用向?qū)峁┑哪J(rèn)選項(xiàng)即可。利用向?qū)Ы⒁粋€(gè)單文檔應(yīng)用程序框架7利用向?qū)Ы⒁粋€(gè)單文檔應(yīng)用程序框架編譯、連接、運(yùn)行MFCAppWizard[exe]向?qū)?chuàng)建的應(yīng)用程序MyTextOut。運(yùn)行結(jié)果如圖所示??蚣埽ú藛螜?、工具欄、狀態(tài)欄)客戶區(qū)單文檔程序要包含文檔,并且一次只能打開一個(gè)文檔,其框架是指菜單欄、工具欄、狀態(tài)欄等界面元素,客戶區(qū)則用于展示用戶文檔。8向?qū)傻暮诵念惣捌涔δ躆FC應(yīng)用程序框架實(shí)質(zhì)上是一個(gè)標(biāo)準(zhǔn)的Windows應(yīng)用程序,它具有標(biāo)準(zhǔn)的窗口、菜單欄和工具欄。MFCAppWizard[exe]向?qū)橐话愕腟DI應(yīng)用程序生成了五個(gè)核心類,它們分別是:應(yīng)用程序類CMyTextOutApp框架窗口類CMainFrame文檔類CMyTextOutDoc視圖類CMyTextOutView文檔模板類CSingleDocTemplate9向?qū)傻暮诵念惣捌涔δ芤话銘?yīng)用程序框架中所有類的名字由MFCAppWizard[exe]向?qū)Ц鶕?jù)一定的規(guī)則自動命名。應(yīng)用程序框架中類(框架窗口類例外)的命名規(guī)則一般遵照如下要求:ClassName=C+ProjectName+ClassType10向?qū)傻暮诵念惣捌涔δ?.應(yīng)用程序類CMyTextOutAppCMyTextOutApp類是MFC的CWinApp類的派生類。它的主要功能有:應(yīng)用程序的初始化;程序的啟動;程序運(yùn)行結(jié)束時(shí)的清理工作。應(yīng)用程序?qū)ο髏heApp是一個(gè)唯一的全局變量,它的主要功能是通過調(diào)用WinMain()主函數(shù)啟動程序的運(yùn)行。MFC應(yīng)用程序框架也有一個(gè)作為程序入口點(diǎn)的WinMain()主函數(shù),但在源程序中看不見該函數(shù),它在MFC中已定義好并同應(yīng)用程序相鏈接。11向?qū)傻暮诵念惣捌涔δ?.框架窗口類CMainFrameCMainFrame類是MFC的CFrameWnd類的派生類。它主要負(fù)責(zé)創(chuàng)建標(biāo)題欄、菜單欄、工具欄和狀態(tài)欄。不同的SDI應(yīng)用程序,其框架窗口類名和文件名是統(tǒng)一的。CMainFrame類中聲明了框架窗口中的工具欄m_wndToolBar、狀態(tài)欄m_wndStatusBar兩個(gè)成員變量和四個(gè)成員函數(shù)。12向?qū)傻暮诵念惣捌涔δ?.文檔類CMyTextOutDoc類CMyTextOutDoc是MFC的CDocument類的派生類,它用于管理和維護(hù)數(shù)據(jù),包括應(yīng)用程序數(shù)據(jù)的保存和裝載,實(shí)現(xiàn)文檔的序列化功能。4.視圖類CMyTextOutView類CMyTextOutView是MFC的CView類的派生類,它主要負(fù)責(zé)客戶區(qū)文檔數(shù)據(jù)的顯示,以及如何進(jìn)行人機(jī)交互。13向?qū)傻暮诵念惣捌涔δ?.文檔模板類CSingleDocTemplate文檔、視圖、框架類和所涉及的資源形成了一種固定的聯(lián)系,這種固定的聯(lián)系就稱為文檔模板。文檔模板類CSingleDocTemplate是MFC的CDocTemplate類的派生類CSingleDocTemplate文檔模板類在應(yīng)用程序中有著非常重要的作用,是它將原本獨(dú)立的文檔、視圖和框架窗口對象聯(lián)系在一起。14文檔/視圖為了統(tǒng)一和簡化數(shù)據(jù)處理,基于MFC的應(yīng)用程序通常采用文檔/視圖結(jié)構(gòu)。在MFC文檔/視圖結(jié)構(gòu)中,有關(guān)數(shù)據(jù)處理的工作可以分為數(shù)據(jù)的處理和數(shù)據(jù)的顯示兩個(gè)部分。文檔負(fù)責(zé)數(shù)據(jù)的處理、數(shù)據(jù)的維護(hù)以及數(shù)據(jù)的存儲,視圖則負(fù)責(zé)數(shù)據(jù)的顯示和數(shù)據(jù)的編輯,客戶區(qū)消息的響應(yīng)和處理等工作,即充當(dāng)了文檔與用戶之間的交互界面。15文檔/視圖文檔(document)是MFC應(yīng)用程序中所處理數(shù)據(jù)的集合,包括文本、圖形、圖像和表格等類型。視圖(view)是文檔在應(yīng)用程序窗口中的一個(gè)映像。視圖就如一個(gè)觀景器,用戶通過視圖看到文檔,通過視圖修改文檔。一個(gè)視圖是一個(gè)沒有邊框的窗口,它位于主框架窗口中的客戶區(qū)。視圖是文檔對外顯示的窗口,但它并不能完全獨(dú)立,它必須依存在一個(gè)框架窗口內(nèi)。16文檔/視圖當(dāng)打開某種類型的文件時(shí),應(yīng)用程序必須確定哪一種文檔模板用于解釋這種文件。在初始化程序時(shí),必須首先注冊文檔模板,以便程序利用這個(gè)模板來完成主框架窗口、視圖、文檔對象的創(chuàng)建和資源的裝入。
BOOLCMyTextOutApp::InitInstance(){……
CSingleDocTemplate*pDocTemplate;//聲明文檔模板指針pDocTemplate=newCSingleDocTemplate(//創(chuàng)建文檔模板對象
IDR_MAINFRAME,//文檔模板使用的資源ID
RUNTIME_CLASS(CMyTextOutDoc),//創(chuàng)建文檔對象
RUNTIME_CLASS(CMainFrame),//創(chuàng)建主SDI框架窗口對象
RUNTIME_CLASS(CMyTextOutView));//創(chuàng)建視圖對象AddDocTemplate(pDocTemplate);//將文檔模板加入鏈表……
}17表9-1MFC應(yīng)用程序?qū)ο笾g的相互訪問方法當(dāng)前位置被訪問的位置訪問方法文檔視圖GetFirstViewPosition()GetNextView()UpdateAllView()文檔模板GetDocTemplate()視圖文檔GetDocument()視圖框架GetParentFrame()框架視圖GetActiveView()框架文檔GetActiveDocument()MDI主框架MDI子框架MDIGetActive()MDI子框架MDI主框架GetParentFrame()任何位置應(yīng)用程序AfxGetApp()任何位置主框架AfxGetMainWnd()18文字的顯示【例9-2】以例9-1的單文檔應(yīng)用程序MyTextOut為基礎(chǔ),添加代碼實(shí)現(xiàn)文本輸出。程序運(yùn)行后在視圖窗口顯示文本串“這是我的第一個(gè)單文檔應(yīng)用程序!”。19文字的顯示【編程步驟】(1)本例需要在視圖類的成員函數(shù)OnDraw()中添加顯示文本的代碼來實(shí)現(xiàn)屏幕輸出。在例9-1生成的框架代碼基礎(chǔ)上,打開Workspace窗口單擊ClassView標(biāo)簽,找到CMyTextOutView類,點(diǎn)擊其左邊的“+”展開該類,雙擊其成員函數(shù)OnDraw(),在編輯窗口出現(xiàn)該成員函數(shù)代碼,在指定位置手工添加如下粗體所示代碼。20文字的顯示voidCMyTextOutView::OnDraw(CDC*pDC){
CMyTextOutDoc*pDoc=GetDocument();//獲得文檔類對象的指針
ASSERT_VALID(pDoc);//檢查該指針是否為空
//TODO:adddrawcodefornativedatahere //在視圖內(nèi)的設(shè)備坐標(biāo)(150,100)位置輸出文本
pDC->TextOut(150,100,“這是我的第一個(gè)單文檔應(yīng)用程序!");}TextOut()是CDC類的成員函數(shù)。其功能是在指定的位置輸出文本串。函數(shù)原型如下:CDC:TextOut(intx,inty,constCString&str)其中參數(shù)x,y指定文本輸出位置坐標(biāo)。參數(shù)str指定輸出內(nèi)容。MFC應(yīng)用程序通常在視圖類CView的成員函數(shù)OnDraw()中實(shí)現(xiàn)屏幕輸出,因?yàn)樵谥禺嫶翱跁r(shí)會自動調(diào)用函數(shù)OnDraw(),這樣才能保證顯示的內(nèi)容在每次重畫窗口時(shí)都能顯示出來。GetDocument()是視圖類的成員函數(shù),調(diào)用它可以返回與視圖相關(guān)聯(lián)的文檔對象的指針,利用這個(gè)指針可以訪問文檔類及其派生類的公有成員。通常的用法如下:CMyTextOutDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);ASSERT_VALID()是MFC庫中的斷言。ASSERT_VALID()的用法是:ASSERT_VALID(一個(gè)從CObject類派生的對象指針)功能:用于對C++對象或指針進(jìn)行有效性判斷,如果出錯(cuò),會彈出帶斷言信息(程序,模塊,assertion行)的對話框。對話框有3個(gè)按鈕:“Break”,“Repeat”(“Debug”),和“Continue”(“Ignore”)?!癇reak”結(jié)束程序,“Continue”忽略斷言,最有用的是“Repeat”按鈕。按下它會在斷言的地方打開源代碼編輯器.在這里可以測試所有的變量值并找出問題所在。21文字的顯示編譯、連接、運(yùn)行程序。運(yùn)行結(jié)果如圖。22設(shè)備環(huán)境DCWindows應(yīng)用程序通過為指定設(shè)備(屏幕,打印機(jī)等)創(chuàng)建一個(gè)設(shè)備環(huán)境(DeviceContext,DC),在DC表示的邏輯意義的“畫布”上進(jìn)行圖形的繪制。DC是一種包含設(shè)備信息的數(shù)據(jù)結(jié)構(gòu),它包含了物理設(shè)備所需的各種狀態(tài)信息。23DC實(shí)際上是一個(gè)關(guān)于如何繪制圖形的方法的集合。它可以確立在應(yīng)用窗口中繪制圖形的方式,即確定繪圖模式和映射模式。當(dāng)應(yīng)用程序需要在某個(gè)圖形設(shè)備上繪圖時(shí),首先要獲取繪圖窗口區(qū)域的一個(gè)設(shè)備環(huán)境DC,之后才能選取合適的繪圖工具進(jìn)行繪圖工作。為了便于繪圖,Windows系統(tǒng)在初始化時(shí)為程序提供了一套默認(rèn)的繪圖屬性和對象集合,所以程序在取得了合適的DC之后,就可以使用這些默認(rèn)的繪圖屬性和對象進(jìn)行繪圖。例如,Windows缺省的DC包括了一支黑色的畫筆,所繪制的線條都是黑色的。設(shè)備環(huán)境DC24圖形設(shè)備接口GDI為了方便圖形繪制,Windows把與繪圖相關(guān)的操作都制作成函數(shù),這些函數(shù)的集合稱為圖形設(shè)備接口(graphicaldeviceinterface,GDI)。GDI提供了各種繪圖函數(shù),例如GDI中有繪制矩形的函數(shù)Rectangle()、繪制文本的函數(shù)DrawText()等。GDI還提供了一套繪圖工具,如Pen(畫筆)、Brush(畫刷)、Font(字體)等。由于在Windows屏幕上看到的所有內(nèi)容都是圖形,所以在應(yīng)用窗口中每次進(jìn)行顯示和編輯操作時(shí),都必須調(diào)用特定的GDI函數(shù)。25CDC類為了支持GDI繪圖,MFC提供了兩種重要的類:設(shè)備環(huán)境類(CDC類),用于設(shè)置繪圖屬性和繪制圖形;繪圖對象類,封裝了各種GDI繪圖對象,包括畫筆、刷子、字體、位圖、調(diào)色板和區(qū)域。MFC中,設(shè)備環(huán)境DC是由VC++的CDC類對象來表示的,可以調(diào)用CDC的很多成員函數(shù)來完成各種各樣的繪圖操作。26CPaintDC類CPaintDC是所有CDC類中最常用的一個(gè)類,它代表了應(yīng)用程序窗口的客戶區(qū),它只能使用于CView類的成員函數(shù)OnDraw中。MFCAppWizard應(yīng)用程序向?qū)?chuàng)建的OnDraw()函數(shù)自動支持所獲取的DC。OnDraw函數(shù)的聲明為:
OnDraw(CDC*pDC);這個(gè)函數(shù)的參數(shù)pDC就是指向CPaintDC類對象的指針,在OnDraw函數(shù)中可以使用CDC類的成員函數(shù)對這個(gè)對象進(jìn)行繪圖操作。27WM_PAINT消息系統(tǒng)每次創(chuàng)建應(yīng)用程序窗口或窗口需要刷新時(shí)都會產(chǎn)生WM_PAINT消息,系統(tǒng)接收到這個(gè)消息就會自動調(diào)用OnDraw函數(shù),應(yīng)用程序也可以使用相關(guān)函數(shù)來激活OnDraw函數(shù),因此,程序中所有對窗口客戶區(qū)進(jìn)行繪圖的代碼都應(yīng)該寫在這個(gè)函數(shù)中。28GDI坐標(biāo)系和映射模式在Windows屏幕上繪圖離不開坐標(biāo)系。上面程序中使用的坐標(biāo)系是MM_TEXT映射模式,MM_TEXT為GDI默認(rèn)的映射模式。該模式下的原點(diǎn)為客戶區(qū)左上角,向下、向右為正向。Windows映射模式就是在Windows方式下的屏幕坐標(biāo)方式。一個(gè)實(shí)際的物理屏幕是由像素組成的。例如1024×768分辨率就是指物理屏幕的實(shí)際寬度為1024個(gè)像素,高度為768個(gè)像素。29表Windows的8種映射模式映射模式映射識別碼邏輯單位坐標(biāo)系設(shè)定MM_TEXT1一個(gè)像素X軸正方向朝右,Y軸正方向朝下MM_LOMETRIC20.1毫米X軸正方向朝右,Y軸正方向朝上MM_HIMETRIC30.01毫米X軸正方向朝右,Y軸正方向朝上MM_LONGLISH40.01英寸X軸正方向朝右,Y軸正方向朝上MM_HIENGLISH50.001英寸X軸正方向朝右,Y軸正方向朝上MM_TWIPS61/1440英寸X軸正方向朝右,Y軸正方向朝上MM_ISOTROPIC7系統(tǒng)確定X、Y軸可任意調(diào)節(jié),X、Y軸比例為1:1MM_ANISOTROPIC8系統(tǒng)確定X、Y軸可任意調(diào)節(jié),X、Y軸比例任意30菜單【例9-3】改進(jìn)例9-2的單文檔應(yīng)用程序MyTextOut,程序運(yùn)行后使用菜單命令,調(diào)用對話框輸入顯示的文本內(nèi)容和顯示的坐標(biāo)位置,按照輸入的內(nèi)容在視圖區(qū)顯示文本。31菜單——建立菜單資源【編程步驟】(1)建立菜單資源。在向?qū)傻某绦蚩蚣苤行薷牟藛钨Y源,添加“文本|顯示文本”菜單。在ResourceView中找到IDR_MAINFRAME資源,雙擊之,在顯示出來的主菜單項(xiàng)最后的虛線空白框處雙擊,在彈出的properties對話框中填寫Caption項(xiàng)為“文本(&T)”,可以看到主菜單最后一個(gè)菜單項(xiàng)即為“文本”,字符“&”用于在顯示字母T時(shí)加下劃線,表示該菜單命令的快捷鍵是“Alt+T”。并使用鼠標(biāo)拖動該菜單項(xiàng)移至“幫助”菜單項(xiàng)左側(cè)。注意,主菜單只有標(biāo)題而沒有相應(yīng)的ID標(biāo)識。32菜單——建立菜單資源33菜單——建立菜單資源接著為主菜單添加菜單項(xiàng)。在“文本”菜單下面的虛線空白框處雙擊,在彈出的properties對話框中填寫Caption項(xiàng)為“顯示文本”,ID是該菜單項(xiàng)的標(biāo)識,在此框中輸入ID_TEXT_OUTPUT。在Prompt文本框中輸入狀態(tài)欄提示語“在視圖區(qū)給定位置顯示輸入的文本內(nèi)容”。34菜單——建立菜單資源35菜單(2)添加菜單命令處理函數(shù)。按下Ctrl+W鍵啟動ClassWizard,在Classname下拉列表框中選擇文檔類CMyTextOutDoc,在ObjectIDs列表框中選擇ID_TEXT_OUTPUT(“顯示文本”菜單項(xiàng)的ID),在Messages列表框中選擇COMMAND,單擊AddFunction按鈕,為“顯示文本”菜單項(xiàng)添加命令處理函數(shù)CMyTextOutDoc::OnTextOutput()。36菜單(3)創(chuàng)建對話框資源。在ResourceView中找到Dialog資源,鼠標(biāo)右擊彈出快捷菜單,單擊“InsertDialog”,添加一個(gè)新對話框,修改其ID為IDD_DLG_TEXT,Caption項(xiàng)為“請輸入文本內(nèi)容和顯示位置”。參見圖示。之后在對話框上放置相應(yīng)的控件并布局。37菜單(4)為對話框資源創(chuàng)建對應(yīng)的對話框類。雙擊對話框資源,彈出為對話框增加類的對話框。設(shè)置對話框類名為CTextDialog,為該類自動生成兩個(gè)文件TextDialog.h和TextDialog.cpp。38菜單為三個(gè)編輯框控件添加成員變量m_strText、m_nText_X、m_nText_Y。如圖所示。39菜單(5)建立文本對話框與文檔類的關(guān)聯(lián)。下面在文檔類CMyTextOutDoc中加入與上述控件變量對應(yīng)的三個(gè)成員變量,即在MyTextOutDoc.h文件中加入:classCMyTextOutDoc:publicCDocument{protected://createfromserializationonly
CMyTextOutDoc();
DECLARE_DYNCREATE(CMyTextOutDoc)
手工添加的三個(gè)變量
int
m_nText_X;
int
m_nText_Y;
CString
m_strText;
……}40菜單(6)在CMyTextOutDoc.cpp文件中加入菜單命令響應(yīng)函數(shù)OnTextOutput()的代碼。voidCMyTextOutDoc::OnTextOutput(){ //TODO:Addyourcommandhandlercodehere
CTextDialog
tdlg;//定義一個(gè)對話框?qū)ο?/p>
if(tdlg.DoModal()==IDOK)//顯示對話框
{//保存編輯框數(shù)據(jù)將控件變量的數(shù)據(jù)保存到文檔類成員變量中
m_nText_X=tdlg.m_nText_
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- led車出租合同范例
- 鄰居單間出租合同范例
- 違造借款合同范例
- 公司電路維修合同范例
- 項(xiàng)目招商商鋪?zhàn)赓U合同范例
- 汽車租賃同城轉(zhuǎn)讓合同范例
- 足浴勞動合同范例
- 廣地出租合同范例
- 廣告招聘合同范例
- 門店房出租合同范例
- 非甾體抗炎藥圍術(shù)期鎮(zhèn)痛專家共識(2024 版)解讀
- 技術(shù)服務(wù)外包勞務(wù)合同范本5篇
- 綠色財(cái)政政策
- 《內(nèi)外科疾病康復(fù)學(xué)》課程教學(xué)大綱
- 期末素養(yǎng)展示-2024-2025學(xué)年語文三年級上冊統(tǒng)編版
- 2024中華人民共和國學(xué)前教育法學(xué)習(xí)解讀課件
- 蒸鍍機(jī)基礎(chǔ)知識單選題100道及答案解析
- 2024年秋新人教PEP版3年級上冊英語教學(xué)課件 Unit 4 第4課時(shí) Part B Let's talk
- 私募股權(quán)基金公司的賬務(wù)處理-記賬實(shí)操
- 期末模擬考試卷01-2024-2025學(xué)年上學(xué)期高二思想政治課《哲學(xué)與人生》原題卷+答案卷
- 沙金礦承包開采合作協(xié)議書范文
評論
0/150
提交評論