visual+c++60可視化編程2_第1頁
visual+c++60可視化編程2_第2頁
visual+c++60可視化編程2_第3頁
visual+c++60可視化編程2_第4頁
visual+c++60可視化編程2_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、visual c+6.0可視化編程 1實例47 SDI應(yīng)用程序框架建立一個SDI應(yīng)用程序第一步選擇Single document,其他取默認(rèn)設(shè)置。2項目工作區(qū)類視圖文件視圖資源視圖文件組成 StdAfx.h和StdAfx.cpp包含程序預(yù)編譯的頭文件Resource.h包含所有資源符號定義的標(biāo)準(zhǔn)頭文件。 program47.rc包含資源描述信息的資源文件-圖標(biāo)、位圖和光標(biāo)等。 program47.rc2包含不能在集成開發(fā)環(huán)境中直接編輯的資源 program47.ico是應(yīng)用程序的圖標(biāo)文件。 program47.bmp是包含工具欄按鈕的位圖文件,可以在集成環(huán)境中進(jìn)行編輯。 Readme.txt是

2、應(yīng)用程序描述文件,對AppWizard生成的原文件進(jìn)行描述3用Developer Studio建立項目Developer Studio會創(chuàng)建很多中間文件 APS /支持ResourceViewBSC /瀏覽器信息文件CLW /支持ClassWizardDSP /項目文件,不能刪除和用文本編輯器編輯DSW /工作空間文件,不能刪除和用文本編輯器編輯MAK /外部的創(chuàng)建文件NCB /支持ClassView OPT /保存工作空間的配置PLG /建立日志文件4一。應(yīng)用程序框架“應(yīng)用程序框架” 定義了應(yīng)用程序的輪廓,為用戶提供了標(biāo)準(zhǔn)的實現(xiàn)接口。Windows應(yīng)用程序的建立都是基于這個框架展開的。5應(yīng)用

3、程序的體系結(jié)構(gòu)基于框架窗口的應(yīng)用程序基于對話框的應(yīng)用程序基于文檔/視圖的應(yīng)用程序6與基于框架窗口的程序框架有關(guān)的 MFC類結(jié)構(gòu)CCmdTargetCWinThreadCWinAppCWndCFrameWndCObject7CCmdTarget類CCmdTarget 是 MFC 消息映射結(jié)構(gòu)的基類。消息映射將命令或消息發(fā)送給應(yīng)用程序編寫的處理命令或消息的響應(yīng)函數(shù)。具有消息處理能力的類均應(yīng)為該類的派生類。8CWinThread 類Microsoft 的類庫支持多個線程的并行執(zhí)行。每個應(yīng)用程序至少有一個線程(被稱作主線程)。CWinThread 封裝了操作系統(tǒng)的調(diào)度功能。9CWinApp類CWinA

4、pp 封裝了 Windows 應(yīng)用程序初始化、運(yùn)行、終止應(yīng)用程序的代碼?;诳蚣芙⒌膽?yīng)用程序必須有一個且只有一個從CWinApp派生的類對象。10CWnd類CWnd是各種窗口、對話框和控制框的通用基類,提供窗口處理中公共的窗口類注冊、窗口創(chuàng)建與撤消等處理操作。11CFrameWnd類提供了一個 Windows 單文檔界面,該界面具有重疊或彈出功能,并且可以通過成員函數(shù)實現(xiàn)對窗口的某些控制操作。12基于框架窗口的應(yīng)用程序結(jié)構(gòu)的類關(guān)系CWinApp應(yīng)用程序?qū)ο?m_pMainWndCFrameWnd應(yīng)用程序框架窗口13程序執(zhí)行過程初始化應(yīng)用程序 初始化實例 創(chuàng)建窗口顯示窗口進(jìn)入消息循環(huán)結(jié)束應(yīng)用程

5、序WinMain(入口)CHelloApp:InitInstanceCHelloWnd:CHelloWndCWnd:ShowWindowCWnd:UpdateWindowCWinApp:RunCWindApp:ExitInstanceCWnd:CreateCHelloApp:InitApplication14WinMain函數(shù)WinMain函數(shù)是應(yīng)用程序的入口。用戶不需要編寫該函數(shù)代碼,由應(yīng)用程序框架提供。主要完成注冊窗口類及消息循環(huán)等標(biāo)準(zhǔn)服務(wù)。程序運(yùn)行時,Windows自動調(diào)用該函數(shù)。15CWinApp 對象CWinApp 的派生類對象要作為全程量定義。WinMain 函數(shù)將會調(diào)用 Init

6、Application和 InitInstance 成員函數(shù)。注意:InitInstance是必須覆蓋的成員函數(shù)。16InitInstance成員函數(shù)通常主要負(fù)責(zé)創(chuàng)建應(yīng)用程序的主窗口對象,并更新、顯示該主窗口。NewShowWindowUpdateWindow17Run 及 ExitInstance成員函數(shù)初始化后,WinMain自動調(diào)用 Run,它主要負(fù)責(zé)執(zhí)行消息循環(huán)。退出應(yīng)用程序時,WinMain要調(diào)用ExitInstace成員函數(shù)。18主邊框窗口CProgram47Frame類:此類的對象代表著應(yīng)用程序的主窗口。它的構(gòu)造函數(shù)調(diào)用基類CFrameWnd的Create函數(shù)創(chuàng)建具體的窗口結(jié)構(gòu)。

7、(程序處理舉例) CProgram47Frame:OnLButtonDown函數(shù):消息處理機(jī)制,當(dāng)鼠標(biāo)坐鍵被按下這一事件被映射到CProgram47Frame的OnLButtonDown函數(shù)上,進(jìn)行消息處理。視圖類 OnPaint()是當(dāng)視類窗口需要在屏幕上輸出時被調(diào)用,負(fù)責(zé)完成窗口的屏幕輸出顯示工作;OnPrint()是當(dāng)打印一頁時被調(diào)用,負(fù)責(zé)完成向某頁打印紙上打印。這兩個函數(shù)的缺省實現(xiàn)中包含了對OnDraw(CDC *pDC)的調(diào)用。19程序運(yùn)行過程分析 CProgram47App類:CProgram47App類的對象代表一個應(yīng)用程序,CWinApp基類決定它的大部分行為。 CProgra

8、m47App theApp; 全局對象,在程序開始運(yùn)行時,調(diào)用 CProgram47App類的構(gòu)造函數(shù)生成。 WinMain函數(shù):并非不存在只是已經(jīng)被隱藏在應(yīng)用程序框架內(nèi)部。 應(yīng)用程序的啟動:當(dāng)開始運(yùn)行應(yīng)用程序時WINDOWS會調(diào)用WinMain函數(shù),WinMain會查找該應(yīng)用程序的全局對象theApp。20CProgram47App:InitInstance成員函數(shù):發(fā)現(xiàn)theApp后自動調(diào)用重載的虛函數(shù)InitInstance來完成主窗口的構(gòu)造和顯示工作。記住這個函數(shù)。CWinApp:Run成員函數(shù):WinMain在調(diào)用InitInstance之后緊接著調(diào)用Run函數(shù),它被隱藏在基類中負(fù)責(zé)

9、傳遞應(yīng)用程序的消息給相應(yīng)的窗口。 (完成了windows API 中函數(shù)GetMessage(), TranslateMessage()和DispatchMessage()的功能。) OnIdle()是在Run()的空閑時間得到執(zhí)行。當(dāng)OnIdle()接收到消息后,轉(zhuǎn)送到Run()進(jìn)行處理。 ExitInstance()用于在程序運(yùn)行實例終止時,進(jìn)行相關(guān)資源的清理及釋放。關(guān)閉應(yīng)用程序:用戶關(guān)閉應(yīng)用程序時會有一系列事件發(fā)生。首先CProgram47Frame對象被刪除,然后退出Run,進(jìn)而退出WinMain,最后刪除CProgram47App對象。 21程序的死亡: 使用者單擊,于是發(fā)出WM-C

10、LOSE CMainWindow并沒有設(shè)置WM-CLOSE處理程序,于是交給默認(rèn)的處理程序,默認(rèn)函數(shù)對于WM-CLOSE的處理方式是調(diào)用:DestroyWindow,并因而發(fā)出WM-DESTROY默認(rèn)的WM-DESTROY處理方式是調(diào)用:PostQuitMessage,因此發(fā)出WM-QUIT.22CWinApp:Run收到WM-QUIT后會結(jié)束內(nèi)部之消息循環(huán),然后調(diào)用ExitInstance,這是CWinApp的一個虛擬函數(shù);如果CMyWinApp改寫了ExitInstance,那么CWinApp:Run所調(diào)用的就是CMyWinApp:ExitInstance,否則就是CWinApp:Exit

11、Instance 最后回到AfxWinMain,執(zhí)行AfxWinTerm,結(jié)束程序。23MFC應(yīng)用程序編程體現(xiàn)了幾個特性:封裝 構(gòu)成MFC框架的是MFC類庫。MFC類庫是C+類庫。這些類封裝了Win32應(yīng)用程序編程接口、封裝了應(yīng)用程序的概念、封裝了OLE特性、封裝了ODBC和DAO數(shù)據(jù)訪問的功能等等,分述如下。 24(1)對Win32應(yīng)用程序編程接口的封裝 用一個C+ Object來包裝一個Windows Object。例如:CWnd是一個C+ window object,它把Windows window(HWND)和Windows window有關(guān)的API函數(shù)封裝在C+ window obj

12、ect的成員函數(shù)內(nèi),后者的成員變量m_hWnd就是前者的窗口句柄。25(2)對應(yīng)用程序概念的封裝 使用SDK編寫Windows應(yīng)用程序時,總要定義窗口過程,登記Windows Class,創(chuàng)建窗口等等。這兩個部分其實都有相當(dāng)程度的不變性,MFC就是把有著相當(dāng)固定行為的WinMain內(nèi)部操作封裝在CWinApp中;把有著相當(dāng)固定行為的WndProc內(nèi)部操作封裝在CFrameWnd中。也就是說,CWinApp代表Windows應(yīng)用程序本體,CFrameWnd代表一個主框窗口。 26MFC把其他許多類似的處理封裝起來,替程序員完成這些工作。另外,MFC提出了以文檔-視圖為中心的編程模式,MFC類庫封

13、裝了對它的支持。文檔是用戶操作的數(shù)據(jù)對象,視圖是數(shù)據(jù)操作的窗口,用戶通過它處理、查看數(shù)據(jù)。27(3)對COM/OLE特性的封裝 OLE建立在COM模型之上,由于支持OLE的應(yīng)用程序必須實現(xiàn)一系列的接口(Interface),因而相當(dāng)繁瑣。MFC的OLE類封裝了OLE API大量的復(fù)雜工作,這些類提供了實現(xiàn)OLE的更高級接口。 (4)對ODBC功能的封裝 以少量的能提供與ODBC之間更高級接口的C+類,封裝了ODBC API的大量的復(fù)雜的工作,提供了一種數(shù)據(jù)庫編程模式。282.繼承 首先,MFC抽象出眾多類的共同特性,設(shè)計出一些基類作為實現(xiàn)其他類的基礎(chǔ)。這些類中最重要的類是CObject和Cmd

14、Target。CObject是MFC的根類,絕大多數(shù)MFC類是其派生的。 包括CCmdTarget。CObject 實現(xiàn)了一些重要的特性,包括動態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、對程序調(diào)試的支持,等等。所有從CObject派生的類都將具備或者可以具備CObject所擁有的特性。29CCmdTarget通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。MFC中,任何可以處理消息的類都從CCmdTarget派生。針對每種不同的對象,MFC都設(shè)計了一組類對這些對象進(jìn)行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是CWnd;應(yīng)用程序?qū)ο螅愂荂WinThre

15、ad;文檔對象,基類是CDocument,等等。303.虛擬函數(shù)和動態(tài)約束 MFC以“C+”為基礎(chǔ),自然支持虛擬函數(shù)和動態(tài)約束。但是作為一個編程框架,有一個問題必須解決:如果僅僅通過虛擬函數(shù)來支持動態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如,CWnd封裝 Windows窗口對象時,每一條Windows消息對應(yīng)一個成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計成虛擬函數(shù),由于數(shù)量太多,實現(xiàn)起來不現(xiàn)實。31于是,MFC建立了消息映射機(jī)制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。 這樣,通過虛擬函數(shù)和消息映射,MFC類提供了豐富的編程接口。程序員繼承

16、基類的同時,把自己實現(xiàn)的虛擬函數(shù)和消息處理函數(shù)嵌入MFC的編程框架。MFC編程框架將在適當(dāng)?shù)臅r候、適當(dāng)?shù)牡胤絹碚{(diào)用程序的代碼。324.MFC的宏觀框架體系 如前所述,MFC實現(xiàn)了對應(yīng)用程序概念的封裝,把類、類的繼承、動態(tài)約束、類的關(guān)系和相互作用等封裝起來。這樣封裝的結(jié)果對程序員來說,是一套開發(fā)模板(或者說模式)。針對不同的應(yīng)用和目的,程序員采用不同的模板。例如,SDI應(yīng)用程序的模板,MDI應(yīng)用程序的模板,規(guī)則DLL應(yīng)用程序的模板,擴(kuò)展DLL應(yīng)用程序的模板,OLE/ACTIVEX應(yīng)用程序的模板,等等。33這些模板都采用了以文檔-視為中心的思想,每一個模板都包含一組特定的類。典型的MDI應(yīng)用程序的

17、構(gòu)成將在下一節(jié)具體討論。為了支持對應(yīng)用程序概念的封裝,MFC內(nèi)部必須作大量的工作:例如,為了實現(xiàn)消息映射機(jī)制,MFC編程框架必須要保證首先得到消息,然后按既定的方法進(jìn)行處理。又如,為了實現(xiàn)對DLL編程的支持和多線程編程的支持,MFC內(nèi)部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來管理一些重要信息。雖然,這些內(nèi)部處理對程序員來說是透明的,但是,懂得和理解MFC內(nèi)部機(jī)制有助于寫出功能靈活而強(qiáng)大的程序。34框架利用消息映像機(jī)制將發(fā)給對象的消息映射到類方法上,使相應(yīng)的窗口或控件自動地處理消息。二。MFC 的消息處理機(jī)制35消息映射的實現(xiàn)說明:在處理消息的窗口類中說明消息響應(yīng)函數(shù):消息響應(yīng)函數(shù)原型D

18、ECLARE_MESSAGE_MAP( )實現(xiàn):在實現(xiàn)程序中說明消息映射BEGIN_MESSAGE_MAP(派生類,基類) 各種消息映射宏END_MESSAGE_MAP( )36消息映射項和處理方法消息響應(yīng)函數(shù)原型:afx_msg void ClassMethod( )消息映射宏:ON_MessageName(ID,ClassMethod)消息響應(yīng)函數(shù)的搜索路徑:自下而上,直到 CCmdTarget37 CProgram47App中的消息映射BEGIN_MESSAGE_MAP(CProgram47App, CWinApp)/AFX_MSG_MAP(CProgram47App)ON_COMMAN

19、D(ID_APP_ABOUT, OnAppAbout)/ ClassWizard將在此處添加/刪除成員,用戶不要編輯此處區(qū)域的代碼/AFX_MSG_MAP/ Standard document commandsON_COMMAND(ID_, CWinApp:On)ON_COMMAND(ID_, CWinApp:On)/ Standard print setup commandON_COMMAND(ID_, CWinApp:On)END_MESSAGE_MAP()38類的消息可以被繼承,如果CProgram47App找不到與消息相匹配的消息處理函數(shù)時,將轉(zhuǎn)去基類CWinApp中尋找。如果在所有基

20、類中都找不到消息處理函數(shù),則執(zhí)行默認(rèn)的消息處理函數(shù)。用戶可以用ClassWizard添加用戶需要的消息映射。但有時需要手工在此處加代碼。39三。窗口輸入消息處理輸入消息分類鼠標(biāo)消息:用戶區(qū)與非用戶區(qū)鍵盤消息:系統(tǒng)鍵消息與非系統(tǒng)鍵消息40鼠標(biāo)輸入消息afx_msg void OnMouse_ (UINT nFlags,Cpoint point)afx_msg void On_Button_ (UINT nFlags,CPoint point)nFlags:標(biāo)識同時按下的虛擬鍵point:光標(biāo)所在的位置41鍵盤輸入消息afx_msg void On_(UINT nChar, UINT nRepCn

21、t,UINT nFlags)nChar:輸入字符的ASCIInRepCnt:重復(fù)擊鍵的次數(shù)nFlags:虛擬鍵碼.42例子應(yīng)用利用AppWizard創(chuàng)建應(yīng)用程序43CCmdTargetCWinThreadCWinAppCWndCFrameWndCObject主要負(fù)責(zé)初始化、運(yùn)行和結(jié)束應(yīng)用程序的執(zhí)行。負(fù)責(zé)管理操作數(shù)據(jù)及顯示,并接收用戶的輸入。結(jié)論:CFrameWnd派生類的負(fù)擔(dān)過重。44文檔、視窗框架結(jié)構(gòu)主要思想:將原CFrameWnd派生類的任務(wù)分配給文檔類(CDocument)和視窗類(CView)。文檔類主要負(fù)責(zé)管理數(shù)據(jù);視窗類主要負(fù)責(zé)顯示文檔內(nèi)容,接收用戶的輸入。45文檔、視窗框架涉及的

22、主要類文檔類(CDocument)管理程序操作的數(shù)據(jù)視窗(CView)顯示數(shù)據(jù)并接收用戶的輸入和編輯信息邊框窗口(CFrameWnd)管理視窗46文檔、視窗框架涉及的主要類文檔模板(CSingleDocTemplate、CMultiDocTemplate)負(fù)責(zé)協(xié)調(diào)文檔、視窗和邊框窗口的工作。通常,一種特定的文檔模板創(chuàng)建并管理已打開的同種類型的所有文檔應(yīng)用程序類(CWinApp)控制應(yīng)用程序的開始運(yùn)行、初始化和結(jié)束47AppWizard、ClassWizard和資源編輯器AppWizard:創(chuàng)建MFC應(yīng)用程序ClassWizard:創(chuàng)建Windows消息和命令的處理函數(shù)創(chuàng)建類成員變量創(chuàng)建和管理類

23、資源編輯器:創(chuàng)建并編輯菜單 、對話框、定制控制框、加速鍵、位圖、圖標(biāo)、光標(biāo)、字符串和版本等資源48利用AppWizard編寫程序的基本步驟1、利用AppWizard創(chuàng)建應(yīng)用程序框架2、若需要增加類成員,利用ClassWizard添加3、若需要重載成員函數(shù),利用ClassWizard添加相應(yīng)的消息映射關(guān)系,并填寫函數(shù)體4、若需要定義類,利用ClassWizard進(jìn)行定義49一個簡單的應(yīng)用程序中的對象Application ObjectDocument TemplateDocumentToolbarStatus BarViewCFrameWnd50使用文檔/視窗結(jié)構(gòu)的意義將數(shù)據(jù)操作與數(shù)據(jù)顯示分開,

24、可以簡化工作量;一組數(shù)據(jù)可以同時以不同的形式顯示在多個視窗中;類庫提供了選擇文件、打開文件和關(guān)閉文件的管理;支持打印預(yù)覽功能51視窗類CObjectCCmdTargetCWndCViewCScrollViewCFormViewCEditViewCRecordView52視窗類中的OnDraw成員函數(shù)每次當(dāng)視窗需要被重新繪制時,應(yīng)用程序框架就要調(diào)用OnDraw函數(shù)。驅(qū)使程序調(diào)用OnDraw的兩個途徑:用戶改變窗口的尺寸;窗口恢復(fù)先前被遮蓋的部分;應(yīng)用程序改變了窗口數(shù)據(jù);程序中調(diào)用Invalidate(或者InvalidateRect),通知Windows調(diào)用OnDraw函數(shù)53實例48 窗口輸出文字與圖形通過實例48 實現(xiàn)在已有框架上添加代碼,在程序中顯示文字與圖形。程序?qū)崿F(xiàn)在應(yīng)用程序文檔窗口中輸出一行文字,并在窗口中心畫一個圓。首先,建立一個SDI應(yīng)用程序框架。54在CProgram48View:OnDraw()中添加代碼void CProgram48View:OnDraw(CDC* pDC)CProgram48Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論