第11章MFC程序設計_第1頁
第11章MFC程序設計_第2頁
第11章MFC程序設計_第3頁
第11章MFC程序設計_第4頁
第11章MFC程序設計_第5頁
已閱讀5頁,還剩147頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第11章

MFC程序設計

MFC(MicrosoftFoundationClass,微軟基礎類庫)是微軟公司提供的一個類庫,大多數(shù)WindowsAPI函數(shù)被封裝在該庫的不同類中,提供了對API函數(shù)更便捷的操作方法。MFC還提供了一種稱為應用程序框架的程序設計方法,利用該方法可以快捷地構(gòu)建出標準Windows程序的基本框架,然后擴展該框架的功能,就能夠快速地設計出功能強大的Windows程序,提高軟件開發(fā)的效率。111.1MFC程序基礎11.1.1MFC類1、MFC類的本質(zhì)Microsoft利用面向?qū)ο蟮某绦蚣夹g將大多數(shù)WindowsAPI函數(shù)封裝在類中,并通過繼承形成了一種具有層次結(jié)構(gòu)的類結(jié)構(gòu),稱為MFC(MicrosoftFoundationClass,微軟基礎類庫)。MFC中的類非常全面,覆蓋了絕大多數(shù)標準Windows程序部件,如窗口、對話框、菜單、工具條、設備環(huán)境、畫筆、調(diào)色板、控件等。在MFC類庫中定義的成員函數(shù)有好幾百個,其中許多是對WindowsAPI函數(shù)的簡單封裝,甚至與對應的API函數(shù)有著相同的函數(shù)名字。22、MFC類的結(jié)構(gòu)311.1.1MFC類3、MFC中主要的類①通用數(shù)據(jù)處理類包括字符串類(CString)、集合類(CByteArray、CDwordArray、CPtrArray、CStringArray等)、映射類(CMapPtrToTpr、CMapStringToOb等)、鏈表類(CObList、CPtrList、CStringList等)②WindowsAPI封裝類將API函數(shù)按其功能分別封裝到不同的類中,并為許多封裝在類中的API函數(shù)提供了缺省參數(shù),使程序員可以通過類成員的方式訪問API函數(shù),簡化了API函數(shù)的訪問。如CWnd、CFrameWnd、CMIDIFrameWnd、CMainFrameWndCDialog、CFileDialogCDC、CPaintDC、CClientDC、CWindowDC等411.1.1MFC類③應用程序框架類將Windows程序的基本結(jié)構(gòu)封裝在不同的類中,程序員可以通過這些類生成Windwos程序的雛形。應用程序框架類包括應用程序類(CWinApp)、線程類(CWindThread)、文檔模板類(CDocTemplate、CSingleDocTemplate、CMultiDocTemplate)、文檔類(CDocument)等④工具類如工具條(CToolBar)、菜單(CMenu)、狀態(tài)欄(CStatusBar)、拆分(CSplitterWnd)和滾動窗口(CScrollBar)等

5⑤OLE類

提供了對OLEAPI的訪問支持,允許用戶創(chuàng)建和編輯復合文檔,在這樣的文檔中可包含文本、圖形、聲音、流媒體等類型的數(shù)據(jù)⑥數(shù)據(jù)庫類提供對各種數(shù)據(jù)庫的存取、建立、連接等操作,如數(shù)據(jù)源類(CDatabase)、記錄集類(CRecordSet)、記錄集視圖類(CRecordView)、DAO接口類(CDaoDatabase)、DAO數(shù)據(jù)集類(CDaoRectordSet)、DAO數(shù)據(jù)表定義類(CDaoTebleDef)等。⑦網(wǎng)絡類允許用戶通過ISAPI或WindowsSockets實現(xiàn)計算機網(wǎng)絡互連,如CSocket類、ISAPI類、CHttpFilter類、CHttpServer類、CSocketFile類等。611.1.2MFC程序的結(jié)構(gòu)1、MFC程序中的類MFC對API程序的結(jié)構(gòu)進行了封裝,程序的不同部分被封裝在不同的類中。MFC程序包括的類①應用程序類應用程序類從CWinApp類派生,用于建立主函數(shù)WinMain

,控制程序的執(zhí)行流程②框架窗口類框架窗口類從CFrameWnd類派生,該類將窗口函數(shù)封裝在其中711.1.2MFC程序的結(jié)構(gòu)③消息映射宏和消息處理函數(shù)消息映射宏用于將消息和消息處理函數(shù)與對應的窗口函數(shù)關聯(lián)起來④一個應用程序?qū)ο髴贸绦驅(qū)ο髣t是程序執(zhí)行的入口點,每個MFC程序都必須有一個應用程序?qū)ο?,程序?zhí)行就從該應用程序?qū)ο蟊唤r開始。811.1.2MFC程序的結(jié)構(gòu)【例11-1】設計一個簡單的MFC程序,該程序在鼠標左鍵單擊位置畫一個矩形,矩形的大小是隨機的。程序設計思路:在程序中設計一個矩形數(shù)組,以鼠標單擊位置為中心,以隨機數(shù)為邊長生成一個矩形,并將此矩形保存在數(shù)組中。然后產(chǎn)生一條WM_PAINT消息,并在相應的消息處理函數(shù)中重繪數(shù)組中的所有矩形。9【例11-1】程序設計方法(1)啟動VC++6.0,建立一個新的工程文件。選擇“新建”對話框中的“工程”標簽,并選中“MFCAppWizard(exe)”,在“位置”編輯框中選擇保存項目文件的目錄“C:\dk”,然后在“工程”編輯框中輸入工程文件名“Rect”,如圖11-2(a)所示。(2)單擊“確定”按鈕后,接下來將是一個多步驟的向?qū)В撓驅(qū)У牟僮鞣椒▽⒃?1.1.3節(jié)介紹。這里選擇“S單個文檔”,如圖11-2(b)所示,然后單擊“完成”按鈕。1011【例11-1】程序設計方法(3)上述過程將產(chǎn)生多個磁盤文件,打開保存本項目所在的磁盤目錄“C:\dk”,保留其中的Rect.ncb,Rect.clw,Rect.dsp,Rect.dsw,Rect.opt,StdAfx.h,StdAfx.cpp,Rect.cpp文件,將其余文件全部刪除。同時,單擊下頁圖11-3中的“FileView”項,展開“SourceFiles”列表,刪除其中除Rect.cpp和StdAfx.cpp之外的所有文件;展開“HeaderFiles”列表,刪除其中除StdAfx.h之外的所有頭文件。1213【例11-1】程序設計方法(4)打開圖11-3中的Rect.cpp文件,用下面的程序代碼替換Rect.cpp原來的程序代碼。//Rect.cpp#include"stdafx.h"classCMyWnd:public

CFrameWnd{

CRectRECT[1000]; //矩形數(shù)組,CRect是矩形

intn; //記錄矩形個數(shù)public:

CMyWnd(){n=0;} //構(gòu)造函數(shù),將n初始為0protected:

afx_msgvoidOnPaint(); //WM_PANIT的消息處理函數(shù)

afx_msgvoidOnLButtonDown(UINT

nFlags,CPointpoint);DECLARE_MESSAGE_MAP() //聲明本類將處理消息};14BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)//消息映射

ON_WM_LBUTTONDOWN()//

WM_LBUTTONDOWN消息

ON_WM_PAINT() //本類將處理WM_PAINT消息END_MESSAGE_MAP()voidCMyWnd::OnLButtonDown(UINT

nFlags,CPointpoint){

if(n<1000){

intr=rand()%50+10; //rand是隨機函數(shù),r在10~60之間

//下面的語句以鼠標光標為中心生成矩形

CRect

rect(point.x-r,point.y-r,point.x+r,point.y+r);

RECT[n]=rect; //將生成的矩形存入數(shù)組

n++;

InvalidateRect(rect,FALSE); //產(chǎn)生WM_PAINT消息

}}15//WM_PAINT消息處理函數(shù),當產(chǎn)生WM_PAINT消息時調(diào)用本函數(shù)voidCMyWnd::OnPaint(){

CPaintDC

dc(this);

dc.SelectStockObject(LTGRAY_BRUSH);

//將淺灰色的畫刷選入設備環(huán)境

for(inti=0;i<n;i++)

dc.Rectangle(RECT[i]);//以淺灰色為填充背景畫矩形}16classCMyApp:public

CWinApp{//應用程序類public:virtualBOOLInitInstance();//重載基類CWinApp類的虛函數(shù)};BOOLCMyApp::InitInstance(){

CMyWnd*pMain=newCMyWnd;//pMain是指向框架窗口的指針

pMain->Create(0,"畫矩形!"); //建立窗口

pMain->ShowWindow(m_nCmdShow);//顯示窗口

this->m_pMainWnd=pMain; //關聯(lián)應用程序與窗口

returnTRUE;}CMyApp

ThisApp;//ThisApp是全局應用程序?qū)ο蟪绦驈拇诉M入WinMain(),以啟動程序的運行1711.1.3MFC程序的執(zhí)行流程1、MFC程序的啟動WindowsC++程序的入口函數(shù)是WinMain,在MFC中WinMain

被MFC封裝在應用程序類CWinApp中。每個MFC程序都有自己的應用程序類,該類繼承了CWinApp類的功能,且能通過其成員函數(shù)InitInstance

將窗口與應用程序?qū)ο箨P聯(lián)在一起。每個Windows程序都必須建立一個且只能是一個應用程序?qū)ο?。在建立應用程序?qū)ο髸r,將自動調(diào)用應用程序類的InitInstance。程序至此開始運行,并執(zhí)行許多默認操作。InitInstance將用不同的類建對象,并通過一定的方式將它們關聯(lián)成在一起。1811.1.3MFC程序的執(zhí)行流程classCMyApp:public

CWinApp{//應用程序類public: virtualBOOLInitInstance};CMyApp

ThisApp;InitInstance()是基類CWinApp中的一個虛函數(shù),每個MFC程序必須重載它,

ThisApp對象的建立引爆了MFC程序的啟動執(zhí)行19InitInstance函數(shù)的執(zhí)行過程2011.1.3MFC程序的執(zhí)行流程2、建立窗口MFC將窗口類的定義和注冊,以及窗口的建立和顯示等操作封裝在類CFrameWnd中,并在該類中提供了建立窗口的默認參數(shù),簡化了窗口的建立過程。應用程序只需繼承CFrameWnd類的功能,就能夠快捷地建立程序窗口。CFrameWnd稱為框架窗口類,用它建立的窗口稱為框架窗口。212、建立窗口

MFC程序窗口的建立是在InitInstance函數(shù)中完成的。在InitInstance中的語句如下:

CMyWnd*pMain=newCMyWnd;

pMain->Create(0,"畫矩形!");

pMain->ShowWindow(m_nCmdShow);this->m_pMainWnd=pMain;

2211.1.3MFC程序的執(zhí)行流程3、建立消息循環(huán)InitInstance建立程序窗口后,接下來將調(diào)用執(zhí)行一個默認的函數(shù)AfxWinMain

,該函數(shù)將采用默認的方式為應用程序建立循環(huán)。2311.1.3MFC程序的執(zhí)行流程4、消息映射每個Windows程序至少有一個窗口,每個窗口都有一個窗口函數(shù)。API程序中的窗口處理函數(shù)是顯而易見的,并且采用簡單明了的switchcase結(jié)構(gòu)處理消息。在MFC程序中,API程序窗口函數(shù)中的消息處理結(jié)構(gòu)被分散到了不同的類中,由MFC進行隱式處理。要在MFC程序中處理消息,就必須了解消息處理的流程。MFC提供了一種稱為消息映射的機制,通過該機制可以很方便地為程序添加事件處理函數(shù),簡化了編程工作。MFC程序設計的主要工作其實就是利用消息映射機制為程序中的不同類添加消息處理函數(shù)。2411.1.3MFC程序的執(zhí)行流程消息映射機制的過程(1)在類聲明中添加DECLARE_MESSAGE_MAP消息映射聲明宏classCMyWnd:public

CFrameWnd{……

DECLARE_MESSAGE_MAP()//聲明本類要處理消息};25消息映射的過程(2)在類的實現(xiàn)文件中添加消息映射宏BEGIN_MESSAGE_MAP(X,xParentClass)

……//在此添加消息映射宏和及其對應的消息函數(shù)END_MESSAGE_MAP()其中X是要添加消息映射宏的類,xParentClass是X的基類比如,例11-1中消息映射的程序代碼如下:BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)ON_WM_LBUTTONDOWN() //處理WM_LBUTTONDOWN消息

ON_WM_PAINT() //聲明處理WM_PAINT消息END_MESSAGE_MAP()26消息映射宏與消息處理函數(shù)事實上,添加消息映射宏的完整形式如下BEGIN_MESSAGE_MAP消息宏,處理對應消息的消息函數(shù)……END_MESSAGE_MAP()必須在此為每個消息宏指定一個處理該消息宏對應的消息函數(shù)名。在例11-1的消息映射宏中只有消息宏,沒有指定其對應的消息函數(shù),是因為那些都是很常用的消息宏,MFC已經(jīng)將它們與默認的消息函數(shù)進行了關聯(lián),不需要再指定了。表11-1列出了MFC為消息映射宏預定義的部分常見消息宏響應函數(shù)。27表11-1常見消息映射宏與消息處理函數(shù)消息映射宏對應消息對應消息處理函數(shù)ON_WM_CHARWM_CHAROnCharON_WM_CLOSEWM_CLOSEOnCloseON_WM_CREATEWM_CREATEOnCreateON_WM_LBUTTONDOWNWM_LBUTTONDOWNOnLButtonDownON_WM_LBUTTONUPWM_LBUTTONUPOnLButtonUpON_WM_RBUTTONDOWNWM_RBUTTONDOWNOnRButtonDownON_WM_RBUTTONUPWM_RBUTTONUPOnRButtonUpON_WM_MOUSEMOVEWM_MOUSEMOVEOnMouseMoveON_WM_PAINTWM_PAINTOnPaint………………2811.1.3MFC程序的執(zhí)行流程(3)在類的實現(xiàn)文件中編寫消息響應函數(shù)如例11-1中的CMyWnd的成員函數(shù)OnPaint,定義如下:voidCMyWnd::OnPaint(){

CPaintDC

dc(this);

dc.SelectStockObject(LTGRAY_BRUSH);for(inti=0;i<n;i++)

dc.Rectangle(RECT[i]);}

2911.2應用程序框架1、概念Windows程序具有標準統(tǒng)一的程序結(jié)構(gòu),每個程序都包括窗口、消息循環(huán)和窗口函數(shù)等組成部分,MFC通過面向?qū)ο蟮某绦蚣夹g將這些必備的程序結(jié)構(gòu)封裝在不同的類中,并且能夠應用這些類生成具有最小功能的Windows程序,稱為應用程序框架。由MFC生成的應用程序框架具有標準的Windows程序窗口、菜單、工具條、狀態(tài)欄及基本的消息處理能力,程序員可以在此基礎上擴展程序功能,開發(fā)出具有強大程序功能的Windows應用程序?!皯贸绦蚩蚣堋倍x了應用程序的輪廓,為用戶提供了標準的實現(xiàn)接口。Windows應用程序的建立都是基于這個框架展開的。3011.2應用程序框架2、MFC應用程序框架的類型MFC提供了三種類型的應用程序框架,它們均可由MFC向?qū)??;诳蚣艽翱诘膽贸绦蚧趯υ捒虻膽贸绦蚧谖臋n/視圖的應用程序31MFC應用程序框架程序的設計方法在VC++的編程中,利用WindowsAPI函數(shù)進行編程時,大量的代碼需要用戶自己編寫,及其戶編程的工作量較大。利用MFC和向?qū)?Wizard)來編寫Windows應用程序首先使用ClassWizard來生成Windows應用程序的基本框架然后用ClassWizard來建立應用程序的類、消息處理、數(shù)據(jù)處理函數(shù)或定義控件的屬性、事件和方法最后把各應用程序所要求的功能添加到類中3211.2.2用向?qū)Ы贸绦蚩蚣躒isualC++提供了建立MFC應用程序框架的向?qū)?,利用該向?qū)踔敛恍枰帉懸恍谐绦虼a就能夠生成一個具有最小功能的標準Windows應用程序框架,該框架程序具有標準的菜單、工具條、窗口及基本的消息處理能力。表11-1列出了MFC提供的主要的框架類型33表11-2MFC向?qū)Э山⒌闹饕獞贸绦蚩蚣茴愋?/p>

ATLCOMAppWizard建立ActiveTemplateLibrary應用程序框架ClusterResourceTypeWizard,建立用于Windows服務器的ClusterResource框架DatabaseProject建立數(shù)據(jù)庫應用程序DevStudioAdd-inWizard建立ActiveX組件和宏ISAPIExtensionWizard建立因特網(wǎng)的服務程序MFCActiveXControlWizard

建立ActiveX控制程序MFCAppWizard(dll)建立MFC的動態(tài)鏈接庫MFCAppWizard(exe)建立MFC應用程序框架Win32Application建立API應用程序框架Win32ConsoleApplication建立基于控制臺的C++程序Win32Dynamic-LinkLibrary建立Win32動態(tài)鏈接庫Win32StaticLibrary建立Win32靜態(tài)鏈接庫3411.2.2用向?qū)Ы贸绦蚩蚣堋纠?1-2】利用VC++6.0的應用程序向?qū)Ы⒁粋€MFCAppWizard(exe)應用程序框架,并在此基礎上擴展該框架程序的功能。建立的過程如下:(1)啟動VC++6.0,選擇“新建”命令,在彈出的對話框中選擇“工程”標簽項,并在對應的列表中選中“MFCAppWizard(exe)”列表項。然后在“位置”編輯框中輸入C:\dk,在“工程”編輯框中輸入My,如圖所示。35設置完成后,單擊“確定”按下,進入向?qū)У?步,如下圖示36選擇一種文檔類型,然后單擊“下一個”,進入第2步37本步向?qū)в糜谠O置程序是否需要進行數(shù)據(jù)庫處理,單擊“下一個”,進入第3步38本步設置程序的復合文檔支持,單擊“下一個”進入下一步,如下圖示39本步用于設置程序的工具條及其顯示式樣,單擊下一步,進行第5步40本步用于設置程序界面的外觀,選擇一種,進入下1步41上述向?qū)н^程將產(chǎn)生5個類(略了CAbout類)本步用于設置與修改各類的基類,單擊完成。4211.2.2用向?qū)Ы贸绦蚩蚣芫幾g并執(zhí)行MFC向?qū)傻膽贸绦蚩蚣?,將見到下面的程序界面。它已具備?guī)范的Windows程序外形,和基本的消息處理能力。程序員只需要在此基礎上添加需要的事件處理函數(shù),就能將它改造成需要的程序。這就是應用程序框架設計的程序思想,解放了程序員!4311.2.2用向?qū)Ы贸绦蚩蚣躆FC應用程序框架向?qū)傻念惣拔募蜷_目錄C:\dk\My,將看到向?qū)闪讼旅娴奈募篗ainFrm.h/MainFrm.cpp

對應框架窗口類MainFrameMy.h/My.cpp

對應應用程序類CMyAppMyView.h/MyView.cpp

對應視圖類CMyVeiwMyDoc.h/MyDoc.cpp

對應文檔類CMyDocStdAfx.h/StdAfx.cpp

每個MFC程序都必須有這兩文件,它們定義了程序需要的全局數(shù)據(jù)結(jié)構(gòu)和全局函數(shù)My.rc

保存菜單、工具欄等資源的文件Resource.h

資源頭文件My.NCB/My.clw/My.dsp/My.dsw

與工程項目相關的文件另外,向?qū)н€建立了Res和Debug兩個目錄。4411.2.3應用程序框架的結(jié)構(gòu)1、VC++向?qū)Ы⒌膽贸绦蚩蚣転橛脩籼峁┝藰藴实某绦驅(qū)崿F(xiàn)接口。為了能在向?qū)Ы⒌膽贸绦蚩蚣芑A上擴展程序功能,應先了解框架程序的結(jié)構(gòu)。2、MFC程序結(jié)構(gòu)被VC++向?qū)Х庋b在應用程序框架的不同類中,每個類獨立完成一部分功能。這些類分別是:應用程序類(CXXWinApp)、文檔類(CXXDoc)、視圖類(CXXView)、框架窗口類(CMinFrame),以及用于表明程序版本信息的對話框(CxxAbout)類。其中的XX是啟動向?qū)r輸入的工程項目名字。453.與基于框架窗口的程序框架有關的MFC類結(jié)構(gòu)CCmdTargetCWinAppCWndCObjectCWinthreadCMyWinAppCViewCMyViewCFrameWndCMyCFrameWndCDocumentCMyDoc46CCmdTarget類CCmdTarget

是MFC消息映射結(jié)構(gòu)的基類。消息映射將命令或消息發(fā)送給應用程序編寫的處理命令或消息的響應函數(shù)。具有消息處理能力的類均應為該類的派生類。CWinThread

類Microsoft的類庫支持多個線程的并行執(zhí)行。每個應用程序至少有一個線程(被稱作主線程)。CWinThread

封裝了操作系統(tǒng)的調(diào)度功能。11.2.3應用程序框架的結(jié)構(gòu)47CWinApp類CWinApp

封裝了Windows應用程序初始化、運行、終止應用程序的代碼?;诳蚣芙⒌膽贸绦虮仨氂幸粋€且只有一個從CWinApp派生的類對象。CWnd類CWnd是各種窗口、對話框和控制框的通用基類,提供窗口處理中公共的窗口類注冊、窗口創(chuàng)建與撤消等處理操作。CFrameWnd類提供了一個Windows單文檔界面,該界面具有重疊或彈出功能,并且可以通過成員函數(shù)實現(xiàn)對窗口的某些控制操作。48基于框架窗口的應用程序結(jié)構(gòu)的類關系CWinApp應用程序?qū)ο?/p>

m_pMainWndCFrameWnd應用程序框架窗口在建立應用程序?qū)ο髸r,MFC會自動執(zhí)行應用程序類中的InitInstance()

,該函數(shù)會建立框架窗口對象,并用指針m_pMainWnd指向該對象,這樣就把應用程序與框架窗口關聯(lián)起來了。11.2.3應用程序框架的結(jié)構(gòu)494.程序執(zhí)行過程MFC程序的執(zhí)行流程與API程序完全相同,程序的入口點是WinMain函數(shù),其執(zhí)行流程仍然是:登記窗口→建立窗口→顯示窗口→建立消息循環(huán)→處理消息。但在MFC程序中,已經(jīng)見不到上述內(nèi)容的任何痕跡,它們已被MFC封裝到了前面介紹的各個類中,并以一種默認的方式被MFC調(diào)用執(zhí)行。框架應程序程序的執(zhí)行也是由應用程序?qū)慕㈤_始的。在前面向?qū)傻拇a中,可以找到如下的語句行。CMyApp

theApp;

這條語句將使程序執(zhí)行進入封裝隱藏的WinMain函數(shù),過程如下:504.程序執(zhí)行過程CWnd::Create初始化應用程序初始化實例

創(chuàng)建窗口顯示窗口進入消息循環(huán)結(jié)束應用程序WinMain(入口)CMyApp::InitInstanceCMyWnd::CHelloWndCWnd::ShowWindowCWnd::UpdateWindowCWinApp::RunCWindApp::ExitInstanceCMyApp::InitApplicationCMyApp

theApp;51WinMain函數(shù)WinMain函數(shù)是應用程序的入口。用戶不需要編寫該函數(shù)代碼,由應用程序框架提供。主要完成注冊窗口類及消息循環(huán)等標準服務。程序運行時,Windows自動調(diào)用該函數(shù)。CWinApp

對象CWinApp

的派生類對象要作為全程量定義。WinMain

函數(shù)將會調(diào)用InitApplication和InitInstance

成員函數(shù)。注意:InitInstance是必須覆蓋的成員函數(shù)。11.2.3應用程序框架的結(jié)構(gòu)52InitInstance成員函數(shù)通常主要負責創(chuàng)建應用程序的主窗口對象,并更新、顯示該主窗口。NewShowWindowUpdateWindowRun及ExitInstance成員函數(shù)初始化后,WinMain自動調(diào)用Run,它主要負責執(zhí)行消息循環(huán)。退出應用程序時,WinMain要調(diào)用ExitInstace成員函數(shù)。11.2.3應用程序框架的結(jié)構(gòu)535、應用程序框架的類分析查看各類的代碼之前,作兩點說明①在向?qū)Ы⒌母鱾€類中都有下面形式的注釋代碼段,介于這對注釋之間的內(nèi)容由MFC向?qū)ё詣犹砑雍蛣h除,程序員不用干涉它。//{{AFX_MSG_MAP(CMainFrame)……//}}AFX_MSG_MAP②在每個類中都會見到“DECLARE_DYNCREATE(類名)”,這是一個宏,用于聲明其括號中的類在程序運行時刻才被加載。11.2.3應用程序框架的結(jié)構(gòu)54(1)應用程序類——CMyApp//My.h#include"resource.h"classCMyApp:publicCWinApp{public:

CMyApp();

//{{AFX_VIRTUAL(CMyApp) //{{……//}}之間的內(nèi)容由向?qū)砑?/p>

public:virtualBOOLInitInstance();//必須重載該函數(shù)

//}}AFX_VIRTUAL

afx_msgvoidOnAppAbout();//菜單“幫助|關于”命令的消息函數(shù)

DECLARE_MESSAGE_MAP()//聲明本類要處理消息};55(1)應用程序類——CMyApp//My.cpp//My類起到了連接作用,它將各類組織在一起,所以包含了各個類的頭//文件#include"stdafx.h" //該頭文件定義了一些全局數(shù)據(jù)、變量、函數(shù)#include"My.h" //本類的頭文件#include"MainFrm.h" //框架窗口類MainFrame的頭文件#include"MyDoc.h" //文檔類MyDoc的頭文件#include“MyView.h” //視圖類MyView的頭文件//下面是CMyApp類實現(xiàn)的菜單消息處理功能BEGIN_MESSAGE_MAP(CMyApp,CWinApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout) //關于對話框

ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)//新建文件

ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)//打開文件END_MESSAGE_MAP()56CMyApp::CMyApp(){} //構(gòu)造函數(shù),以缺省方式實現(xiàn)了許多功能BOOLCMyApp::InitInstance(){

AfxEnableControlContainer(); //允許使用容器

Enable3dControls(); //使用三維控件

//寫注冊表

SetRegistryKey(_T("LocalAppWizard-GeneratedApplications"));

LoadStdProfileSettings(); //裝載標準初始化文件.ini中的選項

CSingleDocTemplate*pDocTemplate; //定義單文檔對象指針

pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,//主菜單標識

RUNTIME_CLASS(CMyDoc),//運行時加載文檔類

RUNTIME_CLASS(CMainFrame),//運行時加載主框架窗口類

RUNTIME_CLASS(CMyView));//運行時加載視圖類

AddDocTemplate(pDocTemplate);

CCommandLineInfo

cmdInfo; //定義一個命令行對象

ParseCommandLine(cmdInfo); //處理命令行消息

if(!ProcessShellCommand(cmdInfo))returnFALSE;

m_pMainWnd->ShowWindow(SW_SHOW); //顯示窗口

m_pMainWnd->UpdateWindow(); //產(chǎn)生WM_PAINT消息,

returnTRUE;}CMyApp

theApp;

57(2)框架窗口類——MainFrame

//MainFrm.h

classCMainFrame:publicCFrameWnd{ //繼承CFrameWnd的功能protected:

CMainFrame(); //構(gòu)造函數(shù)自動實現(xiàn)了許多功能

DECLARE_DYNCREATE(CMainFrame)//與RUNTIME_CLASS相對應public://預定義窗口,用于注冊窗口virtualBOOLPreCreateWindow(CREATESTRUCT&cs); virtual~CMainFrame(); //析構(gòu)函數(shù)

virtualvoidAssertValid()const; //異常診斷和對象內(nèi)部檢測

virtualvoidDump(CDumpContext&dc)const;//用于對象診斷protected:

CStatusBar

m_wndStatusBar; //定義狀態(tài)條

CToolBar

m_wndToolBar; //定義工具條protected://建立窗口

afx_msg

int

OnCreate(LPCREATESTRUCT

lpCreateStruct);

DECLARE_MESSAGE_MAP() //聲明本類要處理消息};58MainFrm.cpp

//MainFrm.cpp

#include"stdafx.h"#include"My.h"#include"MainFrm.h“IMPLEMENT_DYNCREATE(CMainFrame,

CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)

ON_WM_CREATE()

//}}AFX_MSG_MAPEND_MESSAGE_MAP()59int

CMainFrame::OnCreate(LPCREATESTRUCT

lpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1; //創(chuàng)建窗口

//下面的命令建立工具欄

if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failedtocreatetoolbar\n");return-1;}

//下面的命令建立狀態(tài)指示欄

if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators

(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failedtocreatestatusbar\n");return-1; }//下面的命令指定工具欄的??糠绞剑试S??吭诖翱诘娜魏挝恢?/p>

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);return0;}60//下面的函數(shù)為窗口注冊作準備BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&

cs){

if(!CFrameWnd::PreCreateWindow(cs))returnFALSE;

//若不按默認方式定義窗口,可以在此修改cs結(jié)構(gòu)的域

returnTRUE;}//下面兩個函數(shù)主要用于程序調(diào)試時的錯誤診斷#ifdef_DEBUGvoidCMainFrame::AssertValid()const{CFrameWnd::AssertValid();}voidCMainFrame::Dump(CDumpContext&dc)const{CFrameWnd::Dump(dc);}#endif//_DEBUG61(3)文檔類——MyDoc

//MyDoc.h

classCMyDoc:publicCDocument{protected:

CMyDoc(); //構(gòu)造函數(shù)

DECLARE_DYNCREATE(CMyDoc)public:virtualBOOLOnNewDocument(); //菜單中的“新建”命令

virtualvoidSerialize(CArchive&ar);//實現(xiàn)文件存盤和讀取操作

virtual~CMyDoc(); //析構(gòu)函數(shù)

DECLARE_MESSAGE_MAP() };62//MyDoc.cpp#include"stdafx.h"#include"My.h"#include"MyDoc.h"IMPLEMENT_DYNCREATE(CMyDoc,CDocument)BEGIN_MESSAGE_MAP(CMyDoc,CDocument)…… //MFC向?qū)г谶@里添加宏映射的代碼END_MESSAGE_MAP()BOOLCMyDoc::OnNewDocument(){if(!CDocument::OnNewDocument())returnFALSE;…… //可以在此添加程序代碼,實現(xiàn)需要的功能

returnTRUE;}voidCMyDoc::Serialize(CArchive&ar){

if(ar.IsStoring()){…… //可以在此添加數(shù)據(jù)保存的代碼

}else{…… //可以在此添加讀取數(shù)據(jù)的代碼

}63(4)視圖類——MyView

//MyView.h

classCMyView:publicCView{protected:

CMyView();

DECLARE_DYNCREATE(CMyView)public:

CMyDoc*

GetDocument(); //獲取與視圖對應的文檔指針

virtualvoid

OnDraw(CDC*pDC); //輸出函數(shù)

virtualBOOLPreCreateWindow(CREATESTRUCT&cs);//為窗口注冊作準備

protected://下面3個成員函數(shù)實現(xiàn)打印功能,分別對應打印前準備、打印、打印結(jié)束處理

virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);

DECLARE_MESSAGE_MAP()};inlineCMyDoc*CMyView::GetDocument(){return(CMyDoc*)m_pDocument;}64//MyView.cpp

#include"stdafx.h"#include"My.h"#include"MyDoc.h"#include"MyView.h"IMPLEMENT_DYNCREATE(CMyView,CView)//下面的消息映射對應“文件”菜單的“打印、打印預覽”菜單項BEGIN_MESSAGE_MAP(CMyView,CView)

ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()6511.2.4應用程序框架類之間的關系classCMyApp:publicCWinApp{virirtualBOOLInitInstance();

afx_msgvoidOnAppAbout();DECLARE_MESSAGE_MAP()};BOOLCMyApp::InitInstance(){pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame),RNTIME_CLASS(CMyView));

}classCMainFrame:publicCFrameWnd{ afx_msg

int

OnCreate();DECLARE_MESSAGE_MAP() };classCMyDoc:publicCDocument{virtualBOOLOnNewDocument();virtualvoidSerialize(CArchive&ar);DECLARE_MESSAGE_MAP() }; classCMyView:publicCView{CMyDoc*GetDocument(); virtualvoidOnDraw(CDC*pDC);DECLARE_MESSAGE_MAP()};classCAboutDlg:publicCDialog{……};CMyApp

theApp;①⑤④②⑥③6611.3MFC程序輸出11.3.1MFC中的圖形類MFC將設備環(huán)境和圖形設備接口API函數(shù)封在類CDC中,提供了一種簡便的數(shù)據(jù)輸出實現(xiàn)方法。CDC功能強大而復雜,包含了有關設備的屬性和為數(shù)眾多的GDI成員函數(shù),還繼承了CObject類的功能。6711.3.1MFC中的圖形類1.CDC類classCDC:publicCObject{public:

CPen*SelectObject(CPen*pPen); //選擇畫筆virtualCFont*SelectObject(CFont*pFont);//選擇字體CPoint

MoveTo(intx,inty); //將畫筆移到(x,y)BOOLLineTo(intx,inty); //從當前光標位置畫直線到(x,y)

BOOLLineTo(POINTpoint);voidFillRect(LPCRECT

lpRect,CBrush*pBrush);

voidInvertRect(LPCRECT

lpRect); //將產(chǎn)生WM_PAINT

BOOLEllipse(intx1,inty1,intx2,inty2);//畫橢圓BOOLPie(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLRectangle(LPCRECT

lpRect); //畫矩形virtualBOOLTextOut(intx,inty,LPCTSTRlpszString,int

nCount);BOOLTextOut(intx,inty,constCString&str);//在(x,y)輸出字符串str……};682.CPaintDC、CClientDC、CWindowDC類1、各圖形類的功能CPaintDC與ON_PAINT宏相對應,該宏對應的消息處理函數(shù)是OnPaint,用來處理WM_PAINT消息。即當產(chǎn)生WM_PAINT消息時,將調(diào)用OnPaint消息處理函數(shù)。CClientDC

類支持在客戶區(qū)域繪圖,CWindowDC類支持在整個應用程序窗口中繪圖。CPaintDC、CClientDC、CwindowDC這3個類除了一個構(gòu)造函數(shù)外,幾乎沒有定義其他成員函數(shù),但它們繼承了CDC類的成員函數(shù),凡是CDC類定義的公有成員,都可以通過這3個類的對象進行訪問。69CPaintDC、CClientDC、CWindowDC類的構(gòu)造函數(shù)classCPaintDC:publicCDC{public:

CPaintDC(CWnd*pWnd);……};classCClientDC:publicCDC{public:

CClientDC(CWnd*pWnd);……};classCWindowDC:publicCDC{public:

CWindowDC(CWnd*pWnd);……};7011.3.2繪圖對象

1、圖形輸出與繪圖對象CDC及其他幾個圖形類中的成員函數(shù)在繪制圖形或輸出文本時,需要用到畫筆(CPen)、畫刷(CBrush)、字體(CFont)等繪圖對象。應用程序可以根據(jù)需要定義繪圖對象,并用它們繪圖或輸出文本,當應用程序沒有提供自己的繪圖對象時,CDC中的成員函數(shù)將用MFC提供的缺省繪圖對象繪制圖形。7111.3.2繪圖對象

2、繪圖對象類型(1)畫筆對象classCPen:publicCGdiObject{public:

CPen();//構(gòu)造函數(shù)

CPen(int

nPenStyle,int

nWidth,COLORREFcrColor);BOOLCreatePen(int

nPenStyle,int

nWidth,COLORREFcrColor);……};其中,nWidth代表畫筆的寬度(即所畫線條的粗細),crColor代表畫筆的顏色,nPenStyle表示畫筆樣式,如PS_SOLD(實線)、PS_DOT(點)、PS_DASH(虛線)、PS_DASHDOTDOT(雙點)等樣式。7211.3.2繪圖對象

(2)畫刷對象classCBrush:publicCGdiObject{public:

CBrush();

CBrush(COLORREF

crColor); //建立彩色畫刷

CBrush(int

nIndex,COLORREF

crColor); //創(chuàng)建紋理畫刷

CBrush(CBitmap*pBitmap);//創(chuàng)建位圖畫刷,即用位圖填充

BOOLCreateSolidBrush(COLORREF

crColor);//創(chuàng)建彩色實線畫筆……};7311.3.2繪圖對象

(3)字體對象classCFont:publicCGdiObject{public:

CFont();BOOLCreateFontIndirect(constLOGFONT*lpLogFont);BOOLCreateFont(int

nHeight, //字體高度

int

nWidth, //字體寬度

int

nEscapement, //文本輸出角度

int

nOrientation, //字體傾斜度

int

nWeight, //字體粗細

BYTEbItalic, //是否斜體

BYTEbUnderline, //是否帶下劃線

BYTEcStrikeOut, //是否帶穿透線

BYTEnCharSet, //字體所用字符集

BYTEnOutPrecision, //輸出精度

BYTEnClipPrecision,//定義字符溢出邊界的剪切精度

BYTEnQuality, //定義打印字體質(zhì)量

BYTEnPitchAndFamily, //定義字間距、字符集

LPCTSTRlpszFacename); //字體名……);7411.3.2繪圖對象3、應用程序定義并選用繪圖對象的步驟(1)定義繪圖對象(2)選擇繪圖對象(3)還原繪圖對象下面的語句將創(chuàng)建一支3個像素點寬的綠色虛線畫筆,并將其選入設備環(huán)境,繪制一個橢圓,然后還原畫筆。CClientDC

dc(this);CPen*oPen;CPennPen(PS_DASH,3,RGB(0,255,0));oPen=dc.SelectObject(&nPen);dc.Ellipse(10,50,100,200);dc.SelectObject(&oPen);7511.3.2用MFC向?qū)砑酉⒂成浜瘮?shù)1、添加類的消息映射函數(shù)的方法MFC為消息映射提供了一個向?qū)?,該向?qū)軌蜃詣油隇橹付愄砑酉⒂成浜瘮?shù)的雛形。程序員只需要在向?qū)砑拥南⑻幚砗瘮?shù)中添加程序代碼就能夠?qū)崿F(xiàn)需要的程序功能。2、消息映射向?qū)г陬愔刑砑拥某绦虼a①在類聲明中添加消息映射聲明宏DECLARE_MESSAGE_MAP,形式如下:classX{……

DECLARE_MESSAGE_MAP()

};7611.3.2用MFC向?qū)砑酉⒂成浜瘮?shù)②在類的實現(xiàn)文件中添加消息映射,形式如下:BEGIN_MESSAGE_MAP(X,ParentClass)

……

ON_WM_LBUTTONDOWN() ……END_MESSAGE_MAP()③在類的實現(xiàn)文件中添加消息處理函數(shù)voidX::OnLButtonDown(UINT

nFlags,CPointpoint){

……}7711.3.2用MFC向?qū)砑酉⒂成浜瘮?shù)【例11-3】擴展例11-2建立的框架程序的功能。使該程序能夠處理鼠標左鍵和右鍵的單擊事件。單擊左鍵時在光標位置畫橢圓,單擊右鍵時在光標位置畫矩形。程序設計思路:雖然CMyApp、CMainFrame、CMyDoc、CMyView這4個類都具有消息處理能力,都可以實現(xiàn)上述功能,但在CMyView中實現(xiàn)這些功能最簡單。原因是單擊鼠標左鍵、右鍵都需要在屏幕上顯示信息,而CMyView類本身就是被設計來處理數(shù)據(jù)輸出的,所以在CMyView類中實現(xiàn)數(shù)據(jù)輸出最簡單。7811.3.2用MFC向?qū)砑酉⒂成浜瘮?shù)編程過程1.利用MFC向?qū)镃MyView類添加消息映射函數(shù)(1)在VC++6.0中打開例11-2建立的框架程序項目My.dsw,選擇“查看”菜單中的“建立類向?qū)А泵?,或按快捷鍵Ctrl+W,彈出MFC的類向?qū)υ捒?,如圖所示。(2)選擇“MessageMaps”標簽,在“Project”列表框中選擇項目文件My,單擊“Classname”下拉列表,列表中包含有本項目中的所有類“CMyApp、CMainFrame、CMyDoc、CMyView、CAboutDlg”,從中選擇CMyView類名,即為CMyView添加消息映射。

7980(3)“Messages:”列表中列出了Windows系統(tǒng)預定義的Windows消息,單擊垂直滾動條,從中找到“WM_LBUTTONDOW”消息并雙擊它,或選中它然后單擊“AddFunction”按鈕。按照同樣的方式處理WM_RBUTTONDOWN消息。(4)完成了第(3)步操作后,單擊“確定”按鈕,結(jié)束MFC消息映射向?qū)А?/p>

81①查看類向?qū)г贑MyView.h頭文件中添加的消息處理函數(shù)的聲明//MyView.hclassCMyView:publicCView{……protected://{{AFX_MSG(CMyView)

afx_msgvoidOnLButtonDown(UINT

nFlags,CPointpoint);

afx_msgvoidOnRButtonDown(UINT

nFlags,CPointpoint);//}}AFX_MSGDECLARE_MESSAGE_MAP()};上述向?qū)н^程添加了這兩行代碼82②查看MFC向?qū)傻南⒂成浜甏蜷_CMyView.cpp文件,在其中可以看到下面形式的消息宏映射:BEGIN_MESSAGE_MAP(CMyView,CView)//{{AFX_MSG_MAP(CMyView)

ON_WM_LBUTTONDOWN()//單擊鼠標左鍵宏

ON_WM_RBUTTONDOWN()

//單擊鼠標右鍵宏

//}}AFX_MSG_MAP……END_MESSAGE_MAP()上述向?qū)н^程添加了這兩行代碼83③查看MFC向?qū)傻南⑻幚砗瘮?shù)打開CMyView.cpp文件,在其中可以看到下面形式的消息處理函數(shù)。voidCMyView::OnLButtonDown(UINT

nFlags,CPointpoint){

//TODO:Addyourmessagehandlercodehereand/orcalldefault

CView::OnLButtonDown(nFlags,point);}voidCMyView::OnRButtonDown(UINT

nFlags,CPointpoint){

//TODO:Addyourmessagehandlercodehereand/orcalldefault

CView::OnRButtonDown(nFlags,point);}上述向?qū)н^程添加了這樣兩個消息處理函數(shù)框架8411.3.2用MFC向?qū)砑酉⒂成浜瘮?shù)2.設計鼠標右鍵單擊事件的程序代碼,實現(xiàn)如下功能:當單擊鼠標右鍵時,利用CClientDC獲取窗口客戶區(qū)域,然后創(chuàng)建具有3個像素點寬的綠色畫筆和紅色畫刷,并通過CClientDC對象的成員函數(shù)Rectangle繪制矩形。

打開向?qū)傻腃MyView::OnRButtonDown

消息處理函數(shù),在其中輸入程序代碼,如下所示;85voidCMyView::OnRButtonDown(UINT

nFlags,CPointpoint){

CClientDC

dc(this); //定義CClientDC的對象用于輸出

CPen*oPen; //oPen用于保存系統(tǒng)默認畫筆,便于恢復

CBrush*oBrush; //OBrush用于保存系統(tǒng)默認畫刷,便于恢復

CPennPen(PS_DASH,3,RGB(0,255,0));//創(chuàng)建3個像素點寬的綠色實線畫筆

CBrushnBrush(1,RGB(255,0,0));//創(chuàng)建1個像素點寬的紅色畫刷

oPen=dc.SelectObject(&nPen);//選入新建畫筆

oBrush=dc.SelectObject(&nBrush);//選入新畫刷并將原畫刷保存在oPen中

//用新筆新畫刷畫矩形dc.Rectangle(point.x,point.y,point.x+100,point.y+100);

dc.SelectObject(&oPen); //恢復系統(tǒng)默認畫筆

dc.SelectObject(&oBrush); //恢復系統(tǒng)默認畫刷

CView::OnRButtonDown(nFlags,point);}863.設計鼠標左鍵單擊的事件程序代碼設計思想:在CMyView類中添加兩個數(shù)據(jù)成員Rect和n,Rect是一個矩形數(shù)組,n是保存矩形個數(shù)的計數(shù)器。每當單擊鼠標左鍵時,就以鼠標光標位置為中心,用10~60之間的隨機數(shù)為長和寬建立一個矩形,并將該矩形保存在數(shù)組Rect中,同時產(chǎn)生一個WM_PAINT消息,調(diào)用默認的CMyView::OnDraw函數(shù)繪制Rect中的矩形。87實現(xiàn)MyView類鼠標左擊的事件函數(shù)過程(1)通過向?qū)Щ蛑苯釉贛yView.h頭文件中添加兩數(shù)據(jù)成員,如下所示://MyView.hclassCMyView:publicCView{……protected:

intn; //向?qū)砑?/p>

CRectRect[1000]; //向?qū)砑?/p>

……};(2)在CMyView類的構(gòu)造函數(shù)中初始化計數(shù)器nCMyView::CMyView(){n=0;}88(3)修改MFC向?qū)镃MyView生成的事件函數(shù)OnLButtonDown,代碼如下voidCMyView::OnLButtonDown(UINT

nFlags,CPointpoint){

if(n<1000){ //最多產(chǎn)生1000個矩形

intr=rand()%50+10; //產(chǎn)生矩形邊長

//以光標為中心建立矩形

CRect

rect(point.x-r,point.y-r,point.x+r,point.y+r);

Rect[n]=rect; //將矩形保存在數(shù)組中

n++; //增加矩形個數(shù)

InvalidateRect(rect,FALSE);//產(chǎn)生重繪窗口消息,調(diào)用OnDraw函數(shù)

}

CView::OnLButtonDown(nFlags,point);}89(4)改寫CMyView的OnDraw成員函數(shù),將Rect數(shù)組中的矩形繪制在屏幕上,改寫后的OnDraw函數(shù)如下:voidCMyView::OnDraw(CDC*pDC){

CMyDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);

pDC->SelectStockObject(LTGRAY_BRUSH);

for(inti=0;i<n;i++)

//調(diào)用pDC的Rectangle成員繪制矩形

pDC->Rectangle(Rect[i]); }9011.3.4OnPaint函數(shù)與輸出視圖類還有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論