第2-3講MFC原理與方法_第1頁
第2-3講MFC原理與方法_第2頁
第2-3講MFC原理與方法_第3頁
第2-3講MFC原理與方法_第4頁
第2-3講MFC原理與方法_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、MFC微軟基礎(chǔ)類 vMFCMFC(Microsoft Foundation ClassMicrosoft Foundation Class)微軟基礎(chǔ)類微軟基礎(chǔ)類是是一個(gè)由一個(gè)由MicrosoftMicrosoft公司設(shè)計(jì)的類庫。公司設(shè)計(jì)的類庫。vMFCMFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員要做的就是通過接口把具體應(yīng)的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員要做的就是通過接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。用程序特有的東西填入這個(gè)輪廓。vMFCMFC的目的是讓應(yīng)用程序員在應(yīng)用程序框架的基礎(chǔ)上的目的是讓應(yīng)用程序員在應(yīng)用程序框架的基礎(chǔ)上建立

2、建立WindowsWindows下的應(yīng)用程序,這種方法相對(duì)于下的應(yīng)用程序,這種方法相對(duì)于SDKSDK來說更來說更為簡(jiǎn)單。為簡(jiǎn)單。v采用采用MFCMFC方式編程提高了方式編程提高了WindowsWindows應(yīng)用程序的開發(fā)效率。應(yīng)用程序的開發(fā)效率。v認(rèn)識(shí)認(rèn)識(shí)MFCMFC只是一個(gè)過程、一個(gè)手段,最終目的是為了只是一個(gè)過程、一個(gè)手段,最終目的是為了良好并熟練地運(yùn)用良好并熟練地運(yùn)用MFCMFC。 采用MFC編程的優(yōu)點(diǎn)使用標(biāo)準(zhǔn)化的程序代碼結(jié)構(gòu),有利于程序員之間的交流。Visual C+為MFC提供了大量的工具支持,提高了編程效率。如利用MFC AppWizard創(chuàng)建MFC應(yīng)用程序框架,利用ClassWi

3、zard方便地對(duì)Windows消息進(jìn)行管理。MFC應(yīng)用程序的效率較高,只比傳統(tǒng)的Windows C程序低5%左右。并且,在MFC應(yīng)用程序中還允許混合使用傳統(tǒng)的Windows API函數(shù)。其它優(yōu)勢(shì):完全支持Windows所有的函數(shù)、控件、消息、菜單及對(duì)話框;具有良好的穩(wěn)定性和可移植性,更符合微軟的風(fēng)格等。 MFC體系結(jié)構(gòu)MFC主要組成部分:類、宏和全局函數(shù)。類是MFC中最主要的內(nèi)容。MFC類是以層次結(jié)構(gòu)方式組織起來的。MFC中的類分成兩部分,除了一些輔助類,大多數(shù)的MFC類是直接或間接從根類CObject派生而來。幾乎每一個(gè)派生層次都與一具體的Windows實(shí)例相對(duì)應(yīng),如文檔類、窗口類和視圖類等

4、。MFC宏主要功能:消息映射、運(yùn)行時(shí)對(duì)象類型服務(wù)、診斷服務(wù)、異常處理。 MFC約定:全局函數(shù)以“Afx”為前綴,全局變量以“afx”為前綴。 學(xué)習(xí)MFC的方法首先要對(duì)Windows編程概念和API函數(shù)有一定的了解,如Windows API有哪些功能和哪些常用的數(shù)據(jù)結(jié)構(gòu)等。 學(xué)會(huì)抽象地把握問題,不求甚解,不要一開始學(xué)習(xí)Visual C+就試圖了解整個(gè)MFC類庫。從理解和使用兩個(gè)方面學(xué)習(xí)MFC,理解MFC應(yīng)用程序的框架結(jié)構(gòu)。先大體上了解MFC的概念、組成和基本約定,從簡(jiǎn)單的類入手,結(jié)合程序設(shè)計(jì),由淺入深,循序漸進(jìn)、日積月累。 編程時(shí)如果MFC某個(gè)類能完成所需要的功能,可以直接調(diào)用已有類的方法(成員

5、函數(shù))。否則,可以利用面向?qū)ο蠹夹g(shù)中的“繼承”方法對(duì)MFC類的行為進(jìn)行擴(kuò)充和修改,從MFC中已有的類派生出自己需要的類。 學(xué)習(xí)MFC,另一點(diǎn)就是不要過分依賴于向?qū)В╓izard)工具。向?qū)茏鲈S多工作,但同時(shí)掩飾了太多的細(xì)節(jié)。 MFC應(yīng)用程序生成應(yīng)用程序生成MFC中的常用類 CObject、CCmdTarget、CWinThread、CWinApp、CWnd、CFrameWnd、CDialog、CView、CStatic、CButton、CListBox、CComboBox、CEdit、CScrollBarMFC 中的大部分類都是從基類 CObject 中繼承的,該類包含大部分 MFC 類所通

6、用的數(shù)據(jù)成員和成員函數(shù);CWinApp 類是在建立應(yīng)用程序時(shí)需要用到的,并且在任何程序中都只用一次;CWnd 類匯集了 Windows 中的所有通用特性、對(duì)話框和控制。CFrameWnd 類是從 CWnd 中繼承的,并實(shí)現(xiàn)了標(biāo)準(zhǔn)的框架應(yīng)用程序;CDialog 可分別處理無模式和有模式兩種類型的對(duì)話框。CView 用于讓用戶通過窗口來訪問文檔。在MFC應(yīng)用程序的CWinApp派生類對(duì)象theApp是一個(gè)全局變量,代表了應(yīng)用程序運(yùn)行的主線程。它在程序整個(gè)運(yùn)行期間都存在,它的銷毀意味著運(yùn)行程序的消亡。MFC應(yīng)用程序啟動(dòng)時(shí),首先創(chuàng)建應(yīng)用程序?qū)ο髏heApp,這時(shí)將自動(dòng)調(diào)用應(yīng)用程序類的構(gòu)造函數(shù)初始化對(duì)象

7、theApp,然后由應(yīng)用程序框架調(diào)用MFC提供的AfxWinMain()主函數(shù)。 AfxWinMain()主函數(shù)首先通過調(diào)用全局函數(shù)AfxGetApp()獲取應(yīng)用程序?qū)ο髏heApp的指針pApp,然后通過pApp調(diào)用應(yīng)用程序?qū)ο蟮挠嘘P(guān)成員函數(shù),完成程序的初始化和啟動(dòng)工作,最后調(diào)用成員函數(shù)Run(),進(jìn)入消息循環(huán)。程序運(yùn)行后將收到WM_PAINT消息,調(diào)用OnPaint()函數(shù)繪制客戶區(qū)窗口。如果Run()收到WM_QUIT消息,則結(jié)束消息循環(huán),然后調(diào)用函數(shù)ExitInstance(),結(jié)束程序運(yùn)行。 MFC應(yīng)用程序的生與死應(yīng)用程序的生與死 hello程序流程 MFC應(yīng)用程序?qū)ο笾g的關(guān)系應(yīng)用

8、程序?qū)ο笾g的關(guān)系 MFC應(yīng)用程序運(yùn)行后各函數(shù)的調(diào)用關(guān)系應(yīng)用程序運(yùn)行后各函數(shù)的調(diào)用關(guān)系 InitInstance()函數(shù)是派生類唯一需要重函數(shù)是派生類唯一需要重載的函數(shù),它負(fù)責(zé)應(yīng)用程序的初始化。載的函數(shù),它負(fù)責(zé)應(yīng)用程序的初始化。CWinApp類CWinApp 類提供了用戶與 Windows 應(yīng)用程序之間進(jìn)行交流的接口。在生成類的對(duì)象后,對(duì)象自動(dòng)建立與 Windows 系統(tǒng)的連接、接收 Windows 傳送的消息,并交給程序中相應(yīng)的對(duì)象去處理,這就免去了程序員的許多工作,使得開發(fā) C+的 Windows 程序變得簡(jiǎn)單方便。 CWinApp類的對(duì)象theApp將自動(dòng)創(chuàng)建一個(gè)主線程,主線程中有一個(gè)循

9、環(huán)體,用來不斷的從應(yīng)用消息隊(duì)列中提取消息,并發(fā)送回操作系統(tǒng),讓操作系統(tǒng)調(diào)用窗口過程函數(shù),實(shí)現(xiàn)消息響應(yīng)。CWinApp類通過消息映射宏的方式,方便開發(fā)人員完成消息與響應(yīng)函數(shù)之間的對(duì)應(yīng)關(guān)系,大大簡(jiǎn)化了編程難度與復(fù)雜度。CMainFrame類類 CMainFrame 是由 MFC 中的 CFrameWnd 派生的,所以它也是一個(gè)框架窗口。CMainFrame 是類 CXXView 的父類,即 CXXView 類的對(duì)象顯示在主框架窗口的客戶區(qū)中。在類 CMainFrame 中,系統(tǒng)已經(jīng)從類 CFrameWnd 中繼承了處理窗口的一般事件的 Windows消息,如改變窗口的大小、窗口最小化等的成員函數(shù),

10、因此編程時(shí)程序員不必關(guān)心此類消息的處理,從而減輕了程序員的負(fù)擔(dān)。當(dāng)然,如果確實(shí)需要重新編寫此類消息的成員函數(shù),則需要對(duì)原有的成員函數(shù)進(jìn)行重載。 當(dāng)程序的一個(gè)實(shí)例被運(yùn)行時(shí),系統(tǒng)將根據(jù)前面在 CWinApp 類中介紹的文檔模板對(duì)象自動(dòng)生成類 CMainFrame、CXXView、CXXDoc 的對(duì)象,而不需要程序員主動(dòng)地去創(chuàng)建這些類的對(duì)象。 類 CXXView 與 CXXDoc這兩個(gè)類是密切相關(guān)的,文檔是由文檔模板對(duì)象生成的,并由應(yīng)用程序?qū)ο蠊芾恚脩魟t是通過與文檔相聯(lián)系的視窗對(duì)象來存儲(chǔ)、管理應(yīng)用程序中的數(shù)據(jù),用戶與文檔之間的交互是通過與文檔相關(guān)聯(lián)的視窗對(duì)象進(jìn)行的。生成一個(gè)新的文檔時(shí),MFC 程

11、序同時(shí)生成一個(gè)框架窗口,并且在框架窗口的客戶區(qū)中生成一個(gè)視窗對(duì)象作為框架窗口的子窗口,這個(gè)子窗口以可視化的方式表現(xiàn)文檔中的內(nèi)容。視窗的重要功能就是負(fù)責(zé)處理用戶的鼠標(biāo)、鍵盤等操作,通過對(duì)視窗對(duì)象的處理達(dá)到處理文檔對(duì)象的目的。MFC通用控件類和窗口類繪圖類CClientDC 類:一般用來方便地創(chuàng)建和銷毀一個(gè)設(shè)備環(huán)境。CClientDC 通常在堆棧上創(chuàng)建。析構(gòu)函數(shù)自動(dòng)調(diào)用ReleaseDC(),不會(huì)導(dǎo)致內(nèi)存資源泄漏.CWindowDC 類:與 CClientDC 類相似,但它的工作范圍是窗口的非客戶區(qū)。 CPaintDC 類:僅允許繪制無效的窗口客戶區(qū)而不是繪制整個(gè)窗口, CWnd:BeginPai

12、nt()與CWnd:EndPaint()配對(duì)使用;CMetaFileDC 類:用于創(chuàng)建元文件,元文件是一種磁盤文件,它包含了所有的繪圖行為以及繪制圖像所需要的繪圖模式。常用的MFC文件和庫文件 文文 件件 名名 稱稱說說 明明afxwin.h聲明聲明MFC核心類核心類afxext.hMFC擴(kuò)展文件,聲明工具欄、狀態(tài)欄、拆分窗口等類擴(kuò)展文件,聲明工具欄、狀態(tài)欄、拆分窗口等類afxdisp.h聲明聲明OLE類類afxdtctl.h聲明支持聲明支持IE 4公用控件的公用控件的MFC類,如類,如CImageList等等afxcmn.h聲明聲明Windows公共控件類公共控件類Mfc42.libMFCx

13、x.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(Release版)版)Mfc42D.libMFCxx.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(Debug版)版)MfcS42.libMFCSxx.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(Static Release版)版)MfcS42D.libMFCSxxD.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(Static Debug版)版)Mfc42U.libMFCxxU.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(Unicode Release版)版)Mfc42UD.libMFCxxUD.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(Unicode Debug版)版)MfcO42D.libMFCOxxD

14、.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(OLE Debug版)版)MfcD42D.libMFCDxxD.DLL的導(dǎo)入函數(shù)庫(的導(dǎo)入函數(shù)庫(Database Debug版)版)Nafxcw.libMFC靜態(tài)鏈接庫(靜態(tài)鏈接庫(Release版)版)NafxcwD.libMFC靜態(tài)鏈接庫(靜態(tài)鏈接庫(Debug版)版)gdi32.libGDI32.DLL的導(dǎo)入函數(shù)庫的導(dǎo)入函數(shù)庫user32.libUSER32.DLL的導(dǎo)入函數(shù)庫的導(dǎo)入函數(shù)庫kernel32.libKERNEL32.DLL的導(dǎo)入函數(shù)庫的導(dǎo)入函數(shù)庫msvcrt.libMSVCRT.DLL(C運(yùn)行函數(shù)庫)的導(dǎo)入函數(shù)庫運(yùn)行函數(shù)庫)的導(dǎo)入函數(shù)庫

15、msvcrtd.libMSVCRTD.DLL(Debug版版C運(yùn)行函數(shù)庫)的導(dǎo)入函數(shù)庫運(yùn)行函數(shù)庫)的導(dǎo)入函數(shù)庫libcmt.libC運(yùn)行函數(shù)靜態(tài)鏈接庫(多線程)運(yùn)行函數(shù)靜態(tài)鏈接庫(多線程)libc.libC運(yùn)行函數(shù)靜態(tài)鏈接庫(單線程)運(yùn)行函數(shù)靜態(tài)鏈接庫(單線程)進(jìn)入下一節(jié)進(jìn)入下一節(jié)MFC消息管理 MFC應(yīng)用程序消息處理的方式與SDK應(yīng)用程序有所不同。MFC應(yīng)用程序框架截取了Windows向應(yīng)用程序發(fā)出的消息,再確定將消息發(fā)送給哪一個(gè)對(duì)象,可以根據(jù)需要利用函數(shù)重載對(duì)消息進(jìn)行處理,但不需要處理的消息將由應(yīng)用程序框架自動(dòng)處理。消息管理包括消息的發(fā)送和處理。對(duì)于消息發(fā)送,MFC提供了類似于API函數(shù)功

16、能的消息發(fā)送函數(shù),而MFC消息處理的內(nèi)部機(jī)制則相對(duì)復(fù)雜一些。從編程的角度出發(fā),我們只需了解其大致的原理。 MFC的消息分類 標(biāo) 準(zhǔn)標(biāo) 準(zhǔn) W i n d o w s 消 息消 息 : 以: 以 W M _ 前 綴 ( 但 不 包 括前 綴 ( 但 不 包 括WM_COMMAND)開始的消息,包括鼠標(biāo)消息、鍵盤消息開始的消息,包括鼠標(biāo)消息、鍵盤消息和窗口消息,如和窗口消息,如WM_MOVE 、WM_PAINT等。等。 控件通知(控件通知(Control Notification)消息消息:對(duì)控件操作引起的消:對(duì)控件操作引起的消息,是控件和子窗口向其父窗口發(fā)出的息,是控件和子窗口向其父窗口發(fā)出的W

17、M_COMMAND通通知消息。例如,當(dāng)用戶修改了編輯控件中的文本后,編輯控知消息。例如,當(dāng)用戶修改了編輯控件中的文本后,編輯控件向其父窗口發(fā)送件向其父窗口發(fā)送WM_COMMAND通知消息通知消息。 命令(命令(Command)消息消息:由菜單項(xiàng)、工具欄按鈕、快捷鍵等:由菜單項(xiàng)、工具欄按鈕、快捷鍵等用戶界面對(duì)象發(fā)出的用戶界面對(duì)象發(fā)出的WM_COMMAND消息。命令消息與其消息。命令消息與其它消息不同,它可被更廣泛的的對(duì)象如文檔、文檔模板、應(yīng)它消息不同,它可被更廣泛的的對(duì)象如文檔、文檔模板、應(yīng)用程序?qū)ο?、窗口和視圖等處理。用程序?qū)ο?、窗口和視圖等處理。 自定義消息自定義消息MFC消息映射機(jī)制 MF

18、C采用消息映射(Message Map)機(jī)制取代C/C+語言中的switch-case結(jié)構(gòu)來處理消息。MFC消息映射機(jī)制包括一組消息映射宏,一條消息映射宏把一個(gè)Windows消息和其消息處理函數(shù)聯(lián)結(jié)起來。在類定義的結(jié)尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射。在 類 的 實(shí) 現(xiàn) 源 文 件 中 用 B E G I N _ M E S S A G E _ M A P ( ) 和END_MESSAGE_MAP()宏來定義消息映射。ON_COMMAND宏:消息映射宏的第一個(gè)參數(shù)為消息ID,第二個(gè)參數(shù)為消息處理函數(shù)。 如ON_COMMAND(ID_FILE_NEW,CWinAp

19、p:OnFile New)。MFC 使用ClassWizard幫助實(shí)現(xiàn)消息映射功能。v在 AppWizard產(chǎn)生的應(yīng)用程序類的源碼中,應(yīng)用程序類的定義(頭文件)包含了類似如下的代碼: /AFX_MSG(CTttApp)afx_msg void OnAppAbout();/AFX_MSGDECLARE_MESSAGE_MAP()v應(yīng)用程序類的實(shí)現(xiàn)文件中包含了類似如下的代碼:BEGIN_MESSAGE_MAP(CTApp, CWinApp)/AFX_MSG_MAP(CTttApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)/AFX_MSG_MAPEND_MESSAGE

20、_MAP()v頭文件里是消息映射和消息處理函數(shù)的聲明,實(shí)現(xiàn)文件里是消息映射的實(shí)現(xiàn)和消息處理函數(shù)的實(shí)現(xiàn)。它表示讓應(yīng)用程序?qū)ο筇幚砻钕?ID_APP_ABOUT,消息處理函數(shù)是OnAppAbout。 MFC應(yīng)用程序MESSAGE_MAP消息映射形式BEGIN_MESSAGE_MAP(theclass, baseclass)/AFX_MSG_MAP(theclass)ON_ . . . . . . / MFC預(yù)定義的消息映射宏ON_MESSAGE(message , memberFxn) / 用戶自定義的消息映射宏. . . . . . /AFX_MSG_MAPEND_MESSAGE_MAP()

21、注意:注意:特殊注解特殊注解“/“/AFX_MSG_MAP”AFX_MSG_MAP”是是ClassWizardClassWizard類向?qū)ь愊驅(qū)в糜诰S護(hù)消息映射宏的標(biāo)記,用戶不要?jiǎng)h除注解輕易修改注解用于維護(hù)消息映射宏的標(biāo)記,用戶不要?jiǎng)h除注解輕易修改注解內(nèi)的代碼。內(nèi)的代碼。 例 利用ClassWizard為框架類添加消息WM_CLOSE、WM_DESTROY及菜單項(xiàng)“Edit|Copy”的消息處理函數(shù),分析ClassWizard完成了哪些工作。 啟動(dòng)ClassWizard,添加要求的三個(gè)消息處理函數(shù),ClassWizard將在類的實(shí)現(xiàn)文件中添加三個(gè)消息映射宏和消息處理函數(shù)。消息映射宏如下: BE

22、GIN_MESSAGE_MAP(CMainFrame, CFrameWnd) /AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() / 由MFC AppWizard程序向?qū)ё詣?dòng)生成的消息映射 ON_WM_CLOSE() / 由ClassWizard類向?qū)砑?ON_WM_DESTROY() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) /AFX_MSG_MAP END_MESSAGE_MAP() ClassWizard在類的定義中聲明了消息處理函數(shù)class CMainFrame : CFrameWndpublic: CMainFrame(

23、);protected: /AFX_MSG(CMainFrame) / 聲明消息處理函數(shù)原形 a f x _ m s g i n t O n C r e a t e ( L P C R E A T E S T R U C T lpCreateStruct); / 由程序向?qū)ё詣?dòng)生成 afx_msg void OnClose(); / 由ClassWizard類向?qū)砑?afx_msg void OnDestroy(); afx_msg void OnEditCopy(); /AFX_MSG DECLARE_MESSAGE_MAP() / 聲明使用消息映射宏;消息的發(fā)送發(fā)送消息到一個(gè)窗口可以采用

24、傳送(Send)或寄送(Post)方式,這兩種方式之間的主要區(qū)別是消息被接收對(duì)象收到后是否立即被處理。Windows提供了三個(gè)API函數(shù)用于消息的發(fā)送。函數(shù)SendMessage()用于向一個(gè)或多個(gè)窗口傳送消息,該函數(shù)將調(diào)用目標(biāo)窗口的窗口函數(shù),直到目標(biāo)窗口處理完收到的消息,該函數(shù)才返回。 函數(shù)PostMessage()用于向一個(gè)或多個(gè)窗口寄送消息,它把消息放在指定窗口創(chuàng)建的線程的消息隊(duì)列中,然后不等消息處理完就返回。函數(shù)SendDlgItemMessage()函數(shù)用于向?qū)υ捒蛑兄付ǖ目丶l(fā)送消息,直到目標(biāo)控件處理完收到的消息,該函數(shù)才返回。 MFC將這三個(gè)函數(shù)封裝為CWnd窗口類的成員函數(shù),封

25、裝了目標(biāo)窗口句柄,它們將向調(diào)用它的窗口對(duì)象發(fā)送或寄送消息,如pMyView-SendMessage()的調(diào)用形式表示向pMyView所指對(duì)象發(fā)送消息。與用戶輸入相關(guān)的消息(如鼠標(biāo)消息和鍵盤消息)通常是以寄送(Post)的方式發(fā)送,以便這些用戶輸入可以由運(yùn)行較緩慢的系統(tǒng)進(jìn)行緩沖處理。而其它消息通常是以傳送(Send)的方式發(fā)送。手工處理消息映射創(chuàng)建自己的消息映射的具體過程:MFC允許用戶自定義消息,常量WM_USER(為0 x0400)與第一個(gè)自定義消息值相對(duì)應(yīng),用戶必須為自己的消息定義相對(duì)于WM_USER的偏移值。利用#define語句定義自己的消息,例如:#define WM_USER 0X

26、0400#define WM_USER1 WM_USER+0#define WM_USER2 WM_USER+1在BEGIN_MESSAGE_MAP()之后,END_MESSAGE_MAP()之前加入消息映射語句: ON_MESSAGE(message, memberFxn) 其中,message是消息名標(biāo)識(shí),memberFxn是對(duì)應(yīng)的消息處理函數(shù)。必須在函數(shù)返回類型前面加上afx_msg標(biāo)識(shí),如: afx_msg LRESULT memberFxn (WPARAM wParam , LPARAM lParam);其中,參數(shù)wParam、lParam用于傳遞消息的兩個(gè)附加信息???用CWnd:

27、SendMessage()函數(shù)或CWnd: PostMessage()函數(shù)發(fā)送消息。例 編寫一個(gè)自定義消息應(yīng)用程序,程序啟動(dòng)后設(shè)置一個(gè)定時(shí)器,在WM_TIMER的消息處理函數(shù)中發(fā)送一個(gè)用戶自定義消息,在對(duì)應(yīng)的自定義消息處理函數(shù)中以動(dòng)畫的形式旋轉(zhuǎn)顯示一行文本。 基本思路:基本思路: 用用WM_TIMERWM_TIMER消息處理函數(shù)發(fā)送消息;消息處理函數(shù)發(fā)送消息; 啟動(dòng)定時(shí)器啟動(dòng)定時(shí)器 銷毀定時(shí)器銷毀定時(shí)器 用自定義消息完成動(dòng)畫旋轉(zhuǎn)顯示功能。用自定義消息完成動(dòng)畫旋轉(zhuǎn)顯示功能。 自定義消息自定義消息IDID 定義消息映射定義消息映射1.1. 定義消息處理函數(shù)定義消息處理函數(shù)具體過程:1首先利用MFC

28、 AppWizardexe向?qū)?chuàng)建一個(gè)名為Rotate的應(yīng)用程序。利用ClassWizard類向?qū)镃RotateView類生成消息WM_CREATE的消息處理函數(shù),通過設(shè)置定時(shí)器在指定的時(shí)間間隔向窗口發(fā)送WM_TIMER消息。 SetTimer(1,200,NULL); / 啟動(dòng)定時(shí)器2在文件RotateView.cpp開始位置定義一個(gè)用戶自定義消息:#define WM_MYMESSAGE WM_USER+1 利用ClassWizard為CRotateView類生成消息WM_TIME的消息處理函數(shù):SendMessage(WM_MYMESSAGE); 3在類CRotateView的定義中聲

29、明自定義消息處理函數(shù):afx_msg LRESULT OnMyMessage( WPARAM wParam, LPARAM lParam); 在文件RotateView.cpp消息映射BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之間添加自定義消息映射宏:ON_MESSAGE(WM_MYMESSAGE,OnMyMyessage) 4在類CRotateView的定義中聲明一個(gè)private屬性、int型的成員變量m_dEscapement,它表示文本顯示角度,并在類CRotateView的構(gòu)造函數(shù)中初始化:m_dEscapement=0;5利用ClassWizard生成消息

30、WM_DESTROY的消息處理函數(shù),在銷毀已創(chuàng)建的定時(shí)器:KillTimer(1); 6在文件RotateView.cpp中手工添加自定義消息處理函數(shù)實(shí)現(xiàn)代碼,完成以動(dòng)畫形式旋轉(zhuǎn)顯示一行文本的功能。LRESULT CE6_6View:OnMyMessage(WPARAM wParam,LPARAM lParam) CClientDC dc(this); m_dEacapement=(m_dEacapement+100)%3600; CFont fontRotate; fontRotate.CreateFont(30,0,m_dEacapement,0,0,0,0,0,0,0,0,0,0,0);

31、 CFont *pOldFont=dc.SelectObject(&fontRotate); CRect rClient; GetClientRect(rClient); dc.FillSolidRect(&rClient,RGB(255,255,255); dc.TextOut(rClient.right/2,rClient.bottom/2,不登高山不知天之高也); dc.SelectObject(pOldFont); return 0;如果不考慮自定義消息,可以采用其他方式:如果不考慮自定義消息,可以采用其他方式: WM_TIMERWM_TIMER消息處理函數(shù):消息處理函

32、數(shù): 調(diào)用文本顯示函數(shù)調(diào)用文本顯示函數(shù) 旋轉(zhuǎn)變量的計(jì)算旋轉(zhuǎn)變量的計(jì)算 定義一個(gè)函數(shù)用來顯示文本定義一個(gè)函數(shù)用來顯示文本1.1. 定義一個(gè)變量用于文本的位置計(jì)算定義一個(gè)變量用于文本的位置計(jì)算進(jìn)入下一節(jié)進(jìn)入下一節(jié)第三章文檔視圖結(jié)構(gòu):MFC的三種窗體類型 在 MFC 中,文檔是真正的數(shù)據(jù)載體,視圖是文檔的顯示界面,對(duì)應(yīng)于同一個(gè)文檔,可能存在多個(gè)視圖界面,需要另外一種東西將界面管理起來,即框架。 SDI單文檔窗口:一次只處理一個(gè)文檔,譬如記事本,繪圖板;MDI多文檔窗口:可同時(shí)處理多個(gè)文檔,也意味著需要更多的額外編程工作。并不只是要跟蹤所有打開的文檔,還要提供 Window 菜單來管理特殊的程序特性;

33、Dialog對(duì)話框窗口:通常只需要顯示少量的數(shù)據(jù)和獲取少量的用戶輸入,除了節(jié)省資源外,對(duì)話框版本的應(yīng)用程序的加載速度也更快些;文檔和視圖的四個(gè)核心類1.Cdocument(或COleDocument):該類負(fù)責(zé)存儲(chǔ)和管理程序的數(shù)據(jù),并為自定義的文檔類提供基礎(chǔ)的功能。一個(gè)文檔代表一個(gè)數(shù)據(jù)單元,用戶可以通過文件菜單上的“打開”命令打開文檔,或通過文件菜單上的“保存”命令保存文檔。2.Cview類或其派生類:該類為自定義的視圖類提供了基礎(chǔ)的功能。一個(gè)視圖附加到一個(gè)文檔并扮演一個(gè)文檔和用戶的中間人角色:視圖顯示文檔的外觀到屏幕上,并把用戶的輸入翻譯成對(duì)文檔的操作。此外,視圖類還負(fù)責(zé)打印和打印預(yù)覽的顯示

34、。 CView 最常用的函數(shù)是 GetDocument,這個(gè)函數(shù)用于返回與此視圖關(guān)聯(lián)的文檔。同時(shí)CView 具有窗口類的功能,可以方便的定義消息處理函數(shù),MFC 定義了一個(gè)非常好的、在“文檔-視圖-框架”之間的消息傳遞機(jī)制。3.CFrameWnd類:該類支持一個(gè)文檔的一個(gè)或多個(gè)視圖的框架,框架窗口類定義了一個(gè)視圖的容器。一個(gè) SDI 程序只使用一個(gè)框架窗口CFrameWnd 類作為程序的頂層窗口提供視圖的框架。一個(gè) MDI 程序使用兩種不同類型的框架窗口CMDIFrameWnd 作為頂層窗口,CMDIChildWnd 作為浮動(dòng)窗口,為程序文檔提供框架。4. CDocTemplate(CSing

35、leDocTemplate 或 CMultiDocTemplate):文檔模板類支持某種類型的文檔并管理這種類型的文檔、視圖和框架窗口對(duì)象。文檔模板為了管理創(chuàng)建文檔、視圖和框架窗口的復(fù)雜過程,MFC 框架使用兩種文檔模板類:CSingleDocTemplate 類為 SDI(單文檔)程序提供支持CMultiDocTemplate 類為 MDI(多文檔)程序提供支持。一個(gè) CSingleDocTemplate 類可以一次創(chuàng)建和存儲(chǔ)一個(gè)類型的文檔。文檔對(duì)象由程序?qū)ο髣?chuàng)建并維護(hù),在程序的 InitInstance 方法中完成的一個(gè)關(guān)鍵任務(wù)是創(chuàng)建一個(gè)或多個(gè)適當(dāng)類型的文檔模板,程序?qū)ο鬄槟0辶斜碇械拿總€(gè)

36、文檔模板存儲(chǔ)一個(gè)指針,提供一個(gè)接口用來添加文檔模板。如果需要支持兩個(gè)或更多的文檔類型,就應(yīng)該為每種文檔類型添加一個(gè) AddDocTemplate 的調(diào)用。 多文檔和多視圖文檔-視圖程序不僅局限在一個(gè)文檔和基于文檔數(shù)據(jù)的視圖,通過使用 MFC 的 Splitter窗口類,一個(gè)單文檔接口(SDI)程序可以針對(duì)同一個(gè)文檔實(shí)現(xiàn)兩個(gè)或多個(gè)視圖劃分框架窗口客戶區(qū)。文檔-視圖結(jié)構(gòu)可以擴(kuò)展到多文檔接口(MDI)程序,以支持一個(gè)文檔的多視圖、多個(gè)打開的文檔,甚至多個(gè)文檔類型。 MDI 程序和 SDI 程序的主要不同1.MDI 程序從 CMDIFrameWnd 類繼承頂層框架窗口,而不是 CFrameWnd 類。

37、 2.MDI 程序使用基于 CMDIChildWnd 類的子類來表示子框架窗口。 3.MDI 程序使用 CMultiDocTemplate 而不是 CSingleDocTemplate 來創(chuàng)建文檔模板。4.在 CMultiDocTemplate 類中引用的框架窗口是子框架窗口類而不是頂層框架窗口。 5.MDI 程序有至少兩個(gè)菜單資源,當(dāng)沒有文檔打開時(shí)顯示一個(gè)菜單,當(dāng)有至少一個(gè)文檔打開時(shí)顯示另一個(gè)菜單。 單文檔框架的初始化BOOL CSinglePadApp:InitInstance() / 使程序添加對(duì) OLE 控件的包容支持 AfxEnableControlContainer(); #if

38、def _AFXDLL /當(dāng)使用 MFC 動(dòng)態(tài)庫時(shí),使程序控件具有 3D 外觀 Enable3dControls(); #else /當(dāng)使用 MFC 靜態(tài)庫時(shí),使程序控件具有 3D 外觀 Enable3dControlsStatic(); #endif / 程序用來存儲(chǔ)配置信息的注冊(cè)表值 SetRegistryKey(_T(Local AppWizard-Generated Applications); / 加載標(biāo)準(zhǔn)的 INI 文件選項(xiàng)(包括 MRU) LoadStdProfileSettings(); / 注冊(cè)文檔模板 CSingleDocTemplate* pDocTemplate; pD

39、ocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, / 資源 ID,文檔的名稱 RUNTIME_CLASS(CSinglePadDoc), / 文檔 RUNTIME_CLASS(CMainFrame), / 主要的 SDI 框架窗口 RUNTIME_CLASS(CSinglePadView); / 視圖 / 把注冊(cè)的文檔模板添加到程序中 AddDocTemplate(pDocTemplate); / 解析命令行完成如標(biāo)準(zhǔn) Shell 命令、DDE、文件打開操作 CCommandLineInfo cmdInfo; ParseCommandLin

40、e(cmdInfo); / 處理命令行中的命令 if (!ProcessShellCommand(cmdInfo) return FALSE; / 顯示和更新窗口 m_pMainWnd-ShowWindow(SW_SHOW); m_pMainWnd-UpdateWindow(); return TRUE; 多文檔框架的初始化BOOL CMultiPadApp:InitInstance() AfxEnableControlContainer(); / 使程序添加對(duì) OLE 控件的包容支持 #if def _AFXDLL Enable3dControls(); / 使程序控件具有 3D 外觀,當(dāng)使

41、用 MFC 動(dòng)態(tài)庫時(shí)。 #else Enable3dControlsStatic(); / 使程序控件具有 3D 外觀, #endif / 程序用來存儲(chǔ)配置信息的注冊(cè)表值 SetRegistryKey(_T(Local AppWizard-Generated Applications); LoadStdProfileSettings(); / 加載標(biāo)準(zhǔn)的 INI 文件選項(xiàng)(包括 MRU) / 注冊(cè)文檔模板 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MULTIPTYPE, / MDI 窗口

42、的資源 RUNTIME_CLASS(CMultiPadDoc), / MDI 文檔 RUNTIME_CLASS(CChildFrame), / MDI 子框架 RUNTIME_CLASS(CMultiPadView); / MDI 視圖 / 把注冊(cè)的文檔模板添加到程序中 AddDocTemplate(pDocTemplate); / 創(chuàng)建 MDI 主窗口 CMainFrame* pMainFrame = new CMainFrame; / 加載主窗口和主資源 if (!pMainFrame-LoadFrame(IDR_MAINFRAME) return FALSE; m_pMainWnd =

43、pMainFrame; / 解析命令行完成如標(biāo)準(zhǔn) Shell 命令、DDE、文件打開操作 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); / 處理命令行中的命令 if (!ProcessShellCommand(cmdInfo) return FALSE; / 顯示和更新窗口 m_pMainWnd-ShowWindow(SW_SHOW); m_pMainWnd-UpdateWindow(); return TRUE; 例子:生成一個(gè)多文檔記事本視圖選擇為CEditView為基類不用寫一行代碼就實(shí)現(xiàn)了一個(gè)記事本,可以保存,打開文檔文件不用

44、寫一行代碼就實(shí)現(xiàn)了一個(gè)記事本,可以保存,打開文檔文件例子:實(shí)現(xiàn)多文檔的MDI程序更更改改對(duì)對(duì)應(yīng)應(yīng)的的類類名名為為上上圖圖所所示示為了創(chuàng)建一個(gè)新的文檔模板,為了創(chuàng)建一個(gè)新的文檔模板,需要建立三個(gè)類,即需要建立三個(gè)類,即 CBallFrame(子框架窗口(子框架窗口類)、類)、CBallDoc(文檔類)、(文檔類)、CBallView(視圖類)。(視圖類)。添加添加IDR_MULTBTYPE菜單資源中菜單資源中NewHello,New Ball兩個(gè)菜單項(xiàng)兩個(gè)菜單項(xiàng)在在CMDIApp類中添加新增的兩個(gè)菜單項(xiàng)的響應(yīng)函數(shù)類中添加新增的兩個(gè)菜單項(xiàng)的響應(yīng)函數(shù)在在MultiBall.cpp文件中添加三個(gè)子類的

45、頭文件,插入一個(gè)新的菜單資源文件中添加三個(gè)子類的頭文件,插入一個(gè)新的菜單資源IDR_BALLTYPEBOOL CMDIApp:InitInstance()/ 加加Hello模板到模板列表模板到模板列表CMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(IDR_MULTIBTYPE,RUNTIME_CLASS(CHelloDoc),RUNTIME_CLASS(CHelloFrame), / custom MDI child frameRUNTIME_CLASS(CHelloView);AddDocTemplat

46、e(pDocTemplate);/ 加球模板到模板列表加球模板到模板列表CMultiDocTemplate* pBallTemplate = new CMultiDocTemplate(IDR_BALLTYPE,RUNTIME_CLASS(CBallDoc),RUNTIME_CLASS(CBallFrame), / custom MDI child frameRUNTIME_CLASS(CBallView);AddDocTemplate(pBallTemplate);/ create main MDI Frame windowCMainFrame* pMainFrame = new CMain

47、Frame;if (!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;m_pMainWnd = pMainFrame;/ The main window has been initialized, so show and update it.pMainFrame-ShowWindow(m_nCmdShow);pMainFrame-UpdateWindow();return TRUE;添加新建文檔的響應(yīng)函數(shù):添加新建文檔的響應(yīng)函數(shù):OnNewHello,OnNewBall/ 下面兩個(gè)菜單命令處理函數(shù)根據(jù)模板列表創(chuàng)建一個(gè)相應(yīng)的新的視圖文檔下面兩個(gè)菜單

48、命令處理函數(shù)根據(jù)模板列表創(chuàng)建一個(gè)相應(yīng)的新的視圖文檔 void CMDIApp:OnNewHello()/ 搜索模板列表里包含搜索模板列表里包含Hello串的文檔模式串的文檔模式POSITION curTemplatePos = GetFirstDocTemplatePosition();while(curTemplatePos != NULL)CDocTemplate* curTemplate =GetNextDocTemplate(curTemplatePos);CString str;curTemplate-GetDocString(str, CDocTemplate:docName);i

49、f(str = _T(Hello)curTemplate-OpenDocumentFile(NULL);return;AfxMessageBox(No Hello Template);void CMDIApp:OnNewBall()/ 搜索模板列表里包含搜索模板列表里包含Ball串的文檔模式串的文檔模式POSITION curTemplatePos = GetFirstDocTemplatePosition();while(curTemplatePos != NULL)CDocTemplate* curTemplate =GetNextDocTemplate(curTemplatePos);C

50、String str;curTemplate-GetDocString(str, CDocTemplate:docName);if(str = _T(Ball)curTemplate-OpenDocumentFile(NULL);return;AfxMessageBox(No Ball Template);修改字符串資源中修改字符串資源中IDR_MULTIBTYPE的屬性值的屬性值插入新的字符串資源插入新的字符串資源IDR_BALLTYPE,并設(shè)置屬性值,并設(shè)置屬性值將CHelloView更改繼承自CEditView類:替換CHelloView類源文件與頭文件中所有的CView為CEditVi

51、ew;更改CHelloDoc類中Serialize序列化函數(shù)的實(shí)現(xiàn)為:(CEditView*)m_viewList.GetHead()-SerializeRaw(ar); 這樣就可以實(shí)現(xiàn)將CHelloView由普通的視圖類調(diào)整為可以編輯保存的編輯視圖對(duì)象;在CBallView的OnDraw()函數(shù)中添加代碼如下:CRect rect; GetClientRect(rect); pDC-SetTextAlign(TA_BASELINE | TA_CENTER); / 設(shè)置文本排列居中 pDC-SetTextColor(RGB(255,0,0); / 設(shè)置文本顏色 pDC-SetBkMode(TR

52、ANSPARENT); / 設(shè)置背景模式為透明 pDC-TextOut(rect.Width() / 2, rect.Height() / 2, Ball View, 9); 例子二 單文檔多視圖(分割視圖)1.首先創(chuàng)建一個(gè)MFC單文檔應(yīng)用程序。2.添加4個(gè)MFC類TopLView、BottomLView、TopRView、BottomRView,基類為CView。3.添加一個(gè)MFC類CControlForm,基類為CFormView,對(duì)話框ID默認(rèn)。4.創(chuàng)建一個(gè)切分類,如MySplitter,基類為CSplitterWnd(默認(rèn)基類選項(xiàng)中無此類,可以先選擇CFrameWnd類,生成后再修改為

53、CSplitterWnd類)。5.在框架類Cmainframe的頭文件中,添加2個(gè)MySplitter的變量(因?yàn)橄旅嬉M(jìn)行兩次切分操作m_wndSplitter,m_wndSplitter2)。6.重寫框架類CMainframe的OnCreateClient函數(shù),如下:/第一次靜態(tài)切分CreateStatic,一行兩列if (!m_wndSplitter.CreateStatic(this,1,2) return FALSE;/第二次靜態(tài)切分(將第一次切分后的第二列再分為2*2)及所有的子視圖創(chuàng)建(CreateView函數(shù))。if (!m_wndSplitter.CreateView(0,

54、0, RUNTIME_CLASS(CControlForm), CSize(100, 100), pContext) | !m_wndSplitter2.CreateStatic(&m_wndSplitter,2,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0, 1)| !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CTopLView), CSize(350, 240), pContext) | !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLAS

55、S(CBottomLView), CSize(350, 240), pContext) | !m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CTopRView), CSize(350, 240), pContext) | !m_wndSplitter2.CreateView(1, 1, RUNTIME_CLASS(CBottomRView), CSize(350, 240), pContext) m_wndSplitter.DestroyWindow(); return FALSE;/ return CFrameWnd:OnCreateClient

56、(lpcs, pContext); /注釋掉原有的響應(yīng)函數(shù)注意:記得在Mainfrm.h中添加以上五個(gè)視圖類的頭文件:#include ControlForm.h#include TopLView.h#include TopRView.h#include BottomLView.h#include BottomRView.h#include “MySplitter.h”將CMySplitter的構(gòu)造函數(shù)與析構(gòu)函數(shù)改為public屬性第四章:簡(jiǎn)單繪圖繪制線條要求:?jiǎn)螕羰髽?biāo)左鍵并按住拖動(dòng)后,釋放鼠標(biāo)左鍵,完成線條的繪圖。1.新建單文檔類型程序,名為Draw,添加鼠標(biāo)左鍵按下及釋放的消息響應(yīng)函數(shù);2

57、.為CDrawView類添加Cpoint類型成員變量m_ptOrigin;使用SDK全局函數(shù)繪制線條:GetDc可以在任意位置繪圖,前提是得到任意繪圖區(qū)域的句柄可以在任意位置繪圖,前提是得到任意繪圖區(qū)域的句柄必須記住釋放資源必須記住釋放資源利用MFC的CDC類繪圖默認(rèn)獲得的是當(dāng)前上下文環(huán)境下的設(shè)備句柄,默認(rèn)獲得的是當(dāng)前上下文環(huán)境下的設(shè)備句柄,此處獲得的是此處獲得的是CDrawView對(duì)象的指針句柄對(duì)象的指針句柄利用MFC的CClientDC類繪圖CClientDC類的構(gòu)造函數(shù)會(huì)調(diào)用類的構(gòu)造函數(shù)會(huì)調(diào)用GetDC,析,析構(gòu)函數(shù)會(huì)調(diào)用構(gòu)函數(shù)會(huì)調(diào)用ReleaseDC,因此不需要顯式,因此不需要顯式的釋

58、放資源;的釋放資源;當(dāng)將當(dāng)將this更改為更改為GetParent()函數(shù)時(shí),則可以函數(shù)時(shí),則可以在窗口的整個(gè)區(qū)域繪圖包括菜單欄、工具欄,在窗口的整個(gè)區(qū)域繪圖包括菜單欄、工具欄,非客戶區(qū)域;因?yàn)榉强蛻魠^(qū)域;因?yàn)镃DrawView是由是由CMainFrame對(duì)象生成的,因此此處獲得的對(duì)象生成的,因此此處獲得的即為整個(gè)程序的框架窗口設(shè)備句柄;即為整個(gè)程序的框架窗口設(shè)備句柄;利用MFC的CWindowDC類繪圖獲得了桌面窗口的句柄,故可以實(shí)現(xiàn)在整個(gè)獲得了桌面窗口的句柄,故可以實(shí)現(xiàn)在整個(gè)桌面繪圖;桌面繪圖;第五章:菜單操作GetMenu獲得菜單項(xiàng),獲得菜單項(xiàng),GetSubMenu獲得菜單項(xiàng)的子獲得菜單

59、項(xiàng)的子菜單,菜單,checkMenuItem設(shè)置設(shè)置/刪除菜單項(xiàng)的復(fù)選標(biāo)志刪除菜單項(xiàng)的復(fù)選標(biāo)志設(shè)置默認(rèn)菜單項(xiàng),將會(huì)以粗體方式顯示加載圖標(biāo)菜單項(xiàng)獲得默認(rèn)的菜單項(xiàng)所能加載的位圖的尺寸,并已消息獲得默認(rèn)的菜單項(xiàng)所能加載的位圖的尺寸,并已消息框方式顯示出來,此處為框方式顯示出來,此處為13*13在位圖資源編輯器中編輯位圖,使之大小為在位圖資源編輯器中編輯位圖,使之大小為13*13,也可以采用其他工具調(diào)整位圖大小;,也可以采用其他工具調(diào)整位圖大??;移除和加載菜單項(xiàng)Cmenu為局部對(duì)象,可能導(dǎo)致異常,要么將為局部對(duì)象,可能導(dǎo)致異常,要么將menu對(duì)象更改為對(duì)象更改為CMainFrame的成員變量,的成員變

60、量,要么增加一條語句:要么增加一條語句:menu.Detach();創(chuàng)建快捷菜單(右鍵菜單)1.在資源選項(xiàng)的Menu文件夾下右鍵單擊,選擇Insert Menu 命名為 IDR_POPUP_MENU 在里面填一些菜單項(xiàng);2.選中視圖類,在屬性中選擇消息:WM_CONTEXTMENU,添加函數(shù)函數(shù);void CMyDrawView:OnContextMenu(CWnd* pWnd, CPoint point)/ TODO: 在此處添加消息處理程序代碼CMenu m_menu;m_menu.LoadMenuW(IDR_POPUP_MENU);CMenu *popupmenu = m_menu.GetSubMenu(0)

溫馨提示

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