第7章(new)文档和视图_第1页
第7章(new)文档和视图_第2页
第7章(new)文档和视图_第3页
第7章(new)文档和视图_第4页
第7章(new)文档和视图_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章

文档和视图

(Document&View)主讲教师:刘怀广

lhg81219@163.com7.1字符串类CString7.2文档模板

用MFCAppWizard创建的单文档(SDI)或多文档(MDI)应用程序均包含应用程序类、文档类、视图类和框架窗口类,这些类是通过文档模板来有机地联系在一起。7.2.1文档模板类

文档应用程序框架结构是在程序运行一开始构造的,在单文档应用程序(设项目名为Ex_SDI)的应用程序类InitInstance函数中,可以看到这样的代码:BOOLCEx_SDIApp::InitInstance(){…CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate( IDR_MAINFRAME, //资源ID RUNTIME_CLASS(CEx_SDIDoc), //文档类

RUNTIME_CLASS(CMainFrame),//主框架窗口类

RUNTIME_CLASS(CEx_SDIView));//视图类

AddDocTemplate(pDocTemplate);…returnTRUE;}7.2.3使用多个文档类型(自学)[例Ex_MDIDemo]使用多个文档类型(1)创建多文档应用程序项目Ex_MDIDemo。(2)打开项目工作区窗口中StringTable的资源项,双击该项。(3)双击IDR_MAINFRAME列表项,标题修改为“多个文档类型实例”。(4)双击IDR_EX_MDITYPE列表项,在字符串属性对话框中,将其内容修改为:\nPicture\nMDIDemo图片\n图片文件(*.bmp)\n.bmp\nExMDIDemo.Document\nEx_MDIDocument(5)拖动字符串表编辑器右边的滚动块,直到出现最后一个字符串项,双击最后的空行,在字符串属性对话框中将ID设为IDR_OTHERTYPE,标题内容设为:\nTxt\nMDIDemo文本\n文本文件(*.txt,.cpp,*.h)\n.txt;*.cpp;*.h\nExMDIDemo.Document\nEx_MDIDocument7.2.3使用多个文档类型(6)按快捷键Ctrl+W,打开MFCClassWizard,单击[AddClass]按钮,从弹出的菜单中选择New,出现“NewClass”对话框,在Name框中输入类名COtherDoc,在Baseclass组合框中选择基类CDocument。(7)单击[OK]按钮,新的文档类COtherDoc就添加到Ex_MDIDemo项目中。类似的,再添加一个新的视图类COtherView,基类为CView。单击[确定]按钮,关闭MFCClassWizard对话框。(8)修改CEx_MDIDemoApp::InitInstance函数代码,如下所示:7.2.3使用多个文档类型BOOLCEx_MDIDemoApp::InitInstance(){… CMultiDocTemplate*pDocTemplate; pDocTemplate=newCMultiDocTemplate( IDR_EX_MDITYPE, RUNTIME_CLASS(CEx_MDIDemoDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CEx_MDIDemoView)); AddDocTemplate(pDocTemplate); pDocTemplate=newCMultiDocTemplate( IDR_OTHERTYPE, //指定新的资源

RUNTIME_CLASS(COtherDoc), //指定新的文档类

RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(COtherView));//指定新的视图类

AddDocTemplate(pDocTemplate);… returnTRUE;}(9)在类CEx_MDIDemoApp源代码文件Ex_MDIDemo.cpp的开始处,添加包含前面创建的两个派生类的头文件:

#include"OtherDoc.h"#include"OtherView.h"(10)编译运行并测试。一开始弹出文档类型的“新建”对话框,选择“MDIDemo图片”,单击[确定]后,出现CEx_MDIDemo主框架窗口界面,同时出现标题为

“Picture1”的文档窗口。选择“文件”→“新建”菜单,又会出现如图所示的“新建”对话框,选择“MDIDemo文本”,单击[确定]后,出现标题为

“Txt1”的文档窗口。结果如图6.10所示。选择“文件”→“打开”菜单,出现如图6.11所示的文件打开对话框。7.2.3使用多个文档类型图6.10多类型文档窗口显示图6.11文件打开对话框中的文件类型7.2.3使用多个文档类型7.3文档序列化(自学)

用户处理的数据往往需要存盘作永久备份。将文档类中的数据成员变量的值保存在磁盘文件中,或者将存储的文档文件中的数据读取到相应的成员变量中。这个过程称为序列化(Serialize)。7.4视图及视图类MFC中的CView类及其它的派生类封装了视图的各种不同的功能,它们为用户实现最新的Windows特性提供了很大的便利。这些视图类都可以作为文档应用程序中视图类的基类,其设置的方法是在MFCAppWizard创建SDI/MDI的第6步中进行基类的选择。7.4.1一般视图类的使用7.4.1一般视图类的使用1.CEditView类

CEditView类对象是一种视图,像CEdit类一样,它也提供窗口编辑控制功能,可以用来执行简单文本操作,如打印、查找、替换、剪贴板的剪切、复制和粘贴等。由于CEditView类自动封装上述功能的映射函数,因此只要在文档模板中使用CEditView类,那么应用程序的“编辑”菜单和“文件”菜单里的菜单项都可自动激活。[例Ex_Edit]创建一个基于CEditView类的单文档应用程序。(1)选择“文件”→“新建”菜单→“工程”标签,选择MFCAppWizard(exe)的项目类型,输入项目名Ex_Edit,单击[确定]按钮。(2)在向导的第1步中,将应用程序类型选为“单个文档”(SDI)。(3)保留默认选项,单击[下一步]按钮,直到出现向导的第6步,将CEx_EditView的基类选为CEditView,如图所示。(4)单击[完成]按钮,编译运行,打开一个文档,结果如图6.15所示。7.4.1一般视图类的使用7.4.1一般视图类的使用2.CRichEditView类

CRichEditView类使用了复合文本编辑控件,因此它支持混合字体格式和更大数据量的文本。CRichEditView类被设计成与CRichEditDoc和CRichEditCntrItem类一起使用,可实现完整的ActiveX包容器应用程序。3.CFormView类

CFormView类是一个非常有用的视图类,它具有许多无模式对话框的特点。像CDialog的派生类一样,FormView的派生类也和相应的对话框资源相联系,它也支持对话框数据交换和对话框数据确认(DDX和DDV)。CFormView是所有表单视图(如CRecordView、CDaoRecordView、CHtmlView等)的基类;一个基于表单的应用程序能让用户在程序中创建和使用一个或多个表单。

7.4.1一般视图类的使用4.CHtmlView类

CHtmlView

类是在文档视图结构中提供WebBrowser控件的功能。WebBrowser控件可以浏览网址,也可以作为本地文件和网络文件系统的窗口,它支持超级链接、统一资源定位(URL)导航器并维护历史列表等。5.CScrollView类

CScrollView类不仅能直接支持视图的滚动操作,而且还能管理视口的大小和映射模式,并能响应滚动条消息、键盘消息以及鼠标滚轮消息。7.4.2列表控件和列表视图

列表控件是一种极为有用的控件之一,它可以用“大图标”、“小图标”、“列表视图”或“报表视图”等四种不同的方式来显示一组信息,如图所示。7.4.3树控件和树视图1.树形视图的风格常见的树控件风格如表所示,其修改方法与列表控件同的一般风格修改方法相同。7.7文档视图结构

文档和视图是编程者最关心的,应用程序的大部分代码都会被添加在这两个类中。文档和视图紧密相联,是用户与文档之间的交互接口;用户通过文档视图结构可实现数据的传输、编辑、读取和保存等。但文档、视图以及应用程序框架的相关部分之间还包含了一系列非常复杂的相互作用。切分窗口及一档多视是文档和视图相互作用的典型实例。7.7.1文档与视图的相互作用CView::GetDocument函数当MFCAppWizard产生应用程序CView类时,它同时也创建一个安全类型的GetDocument函数,它返回的是指向用户派生文档类的指针。该函数是一个内联(inline)函数,如下面的代码:CEx_SDIDoc*CEx_SDIView::GetDocument()//non-debugversionisinline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEx_SDIDoc)));//“断言”m_pDocument指针所指向的CEx_SDIDoc类是一个RUNTIME_CLASS类型

return(CEx_SDIDoc*)m_pDocument;}2.CDocument::UpdateAllViews函数

如果文档中的数据发生了改变,那么所有的视图都必须被通知到,以便它们能够对所显示的数据进行相应的更新。voidUpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL)pSender:视图指针。若在应用程序文档类的成员函数中调用该函数,则为NULL;被应用程序视图类中的成员函数调用,则此参数应为this。lHint:更新视图时发送信息的提示标识值;pHint:存贮信息的对象指针。当UpdateAllViews被调用时:如果参数pSender指向某个特定的视图对象,那么除了该指定的视图之外,文档的所有其他视图的OnUpdate函数都会被调用。7.7.1文档与视图的相互作用3.CView::OnUpdate函数virtualvoidOnUpdate(CView*pSender,LPARAMlHint,CObject*pHint);pSender:文档所在视图类指针,当为NULL时表示所有的视图需要更新。OnUpdate默认(lHint=0,pHint=NULL)使得整个窗口矩形无效。如果用户想要视图的某部分无效,那么用户就要定义相关的提示(Hint)参数给出准确的无效区域;lHint和pHint含义同UpdateAllViews。事实上,hint机制主要用来在视图中根据提示标识值来获取文档或其他视图传递来的数据,例如将文档的CPoint数据传给所有的视图类,则有下列语句:GetDocument()->UpdateAllViews(NULL,1,(CObject*)&m_ptDraw);CView::OnUpdate函数是一个虚函数,当应用程序调用了CDocument::UpdateAllViews函数时,应用程序框架就会相应地调用该函数。7.7.1文档与视图的相互作用4.CView::OnInitialUpdate函数

当应用程序被启动时,或当用户从“文件”菜单中选择了“新建”或“打开”时,该虚函数都会被自动调用。该函数除了调用无提示参数(lHint=0,pHint=NULL)的OnUpdate函数之外,没做其他任何事情。但用户可以重载此函数对文档所需信息进行初始化操作。例如,如果用户应用程序中的文档大小是固定的,那么用户就可以在此重载函数中根据文档大小设置视图滚动范围;如果应用程序中的文档大小是动态的,那么用户就可在文档每次改变时调用OnUpdate来更新视图的滚动范围。7.7.1文档与视图的相互作用5.CDocument::OnNewDocument函数

在文档应用程序中,当用户从“文件”菜单中选择“新建”命令时,框架将首先构造一个文档对象,然后调用该虚函数。这里是设置文档数据成员初始值的好地方,当然用户还可在文档构造函数中添加初始化代码。

MFCAppWizard为用户的派生文档类自动产生重载的OnNewDocument。BOOLCMyDoc::OnNewDocument(){if(!CDocument::OnNewDocument())//注意一定要保证对基类函数的调用

returnFALSE;//Doinitializationofnewdocumenthere.returnTRUE;}7.7.1文档与视图的相互作用7.7.2应用程序对象指针的互调//使用CDocument::GetFirstViewPosition和GetNextView重绘每个视图:voidCMyDoc::OnRepaintAllViews(){POSITIONpos=GetFirstViewPosition();while(pos!=NULL){CView*pView=GetNextView(pos);pView->UpdateWindow();}}//实现上述功能也可直接调用UpdateAllViews(NULL);1.从文档类中获取视图对象指针GetFirstViewPosition:获得与文档类相关联的视图列表中第一个可见视图的位置。GetNextView:获取指定视图位置的视图类指针,并将此视图位置移动到下一个位置,若没有下一个视图,则视图位置为NULL。virtualPOSITIONGetFirstViewPosition()const;virtualCView*GetNextView(POSITION&rPosition)const;7.7.2应用程序对象指针的互调2.从视图类中获取文档对象和主框架对象指针

在视图类中获取文档对象指针是很容易的,只需调用GetDocument即可。而函数CWnd::GetParentFrame可实现从视图类中获取主框架指针:CFrameWnd*GetParentFrame()const;3.在主框架类中获取视图对象指针

对于单文档应用程序,只需调用CFrameWnd类的GetActiveView成员函数CView*GetActiveView()const;7.7.2应用程序对象指针的互调CXXAppCMainFrameCChildFrameCXXDocumentCXXView7.7.3切分窗口1.静态切分和动态切分静态切分:第一次被创建时,窗格就已经被切分好了,次序和数目不能再被改变,但可以移动切分条来调整窗格的大小。每个窗格是不同的视图类。动态切分:它允许用户在任何时候对窗口进行切分,用户既可以通过选择菜单项来对窗口进行切分,也可以通过拖动滚动条中的切分块对窗口进行切分。动态切分窗口中的窗格通常使用的是同一个视图类。2.切分窗口的CSplitterWnd类操作CSplitterWnd类封装了窗口切分过程中所需的功能函数,其中成员函数Create和CreateStatic分别用来创建“动态切分”和“静态切分”的文档窗口:BOOLCreate(CWnd*pParentWnd,intnMaxRows,intnMaxCols,SIZEsizeMin,CCreateContext*pContext,DWORDdwStyle=WS_CHILD| WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|SPLS_DYNAMIC_SPLIT,UINTnID=AFX_IDW_PANE_FIRST);BOOLCreateStatic(CWnd*pParentWnd,intnRows,intnCols,DWORDdwStyle=WS_CHILD|WS_VISIBLE,UINTnID=AFX_IDW_PANE_FIRST);pParentWnd:切分窗口的父框架窗口。nMaxRows:窗口动态切分的最大行数(不能超过2)。nMaxCols:窗口动态切分的最大列数(不能超过2)。nRows:窗口静态切分的行数(不能超过16)。nCols:窗口静态切分的列数(不能超过16)。sizeMin:动态切分时允许的窗格最小尺寸。7.7.3切分窗口CSplitterWnd类成员函数CreateView用来为静态窗格指定一个视图类,并创建视图窗口:BOOLCreateView(introw,intcol,CRuntimeClass*pViewClass,SIZEsizeInit,CCreateContext*pContext);row和col:指定具体的静态窗格;pViewClass:指定与静态窗格相关联的视图类;sizeInit:视图窗口初始大小;pContext:指定一个“创建上下文”指针。“创建上下文”结构CCreateContext包含当前文档视图框架结构。7.7.3切分窗口CSplitterWnd类成员函数SetColumnInfo和SetRowInfo用来设置单元格的宽度:7.7.3切分窗口3.静态切分窗口实现[例Ex_SplitSDI]将单文档应用程序中的文档窗口静态分成3x2个窗格(1)

用MFCAppWizard创建一个默认的单文档应用程序Ex_SplitSDI。(2)

为CMainFrame类添加一个保护型的切分窗口的数据成员如下:protected://controlbarembeddedmembers CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CSplitterWnd m_wndSplitter;(3)

用MFCClassWizard创建一个新的视图类CDemoView(基类为CView)用于与静态切分的窗格相关联。7.7.3切分窗口BOOLCMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){ CRectrc; GetClientRect(rc); //获取客户区大小

CSizepaneSize(rc.Width()/2-16,rc.Height()/3-16);//计算每个窗格的平均尺寸

m_wndSplitter.CreateStatic(this,3,2);//创建3x2个静态窗格

m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDemoView), paneSize,pContext); //为相应的窗格指定视图类 (4)用MFCClassWizard为CMainFrame类添加OnCreateClient(当主框架窗口客户区创建的时候自动调用该函数)函数重载,并添加下列代码:7.7.3切分窗口 //………..m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDemoView),paneSize,pContext); m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CDemoView),paneSize,pContext); m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CDemoView),paneSize,pContext); m_wndSplitter.CreateView(2,0,RUNTIME_CLASS(CDemoView),paneSize,pContext); m_wndSplitter.CreateView(2,1,RUNTIME_CLASS(CDemoView),paneSize,pContext); returnTRUE;}7.7.3切分窗口第0,0窗格第1,0窗格第2,0窗格第0,1窗格第1,1窗格第2,1窗格切分条(5)在MainFrm.cpp源文件的开始处,添加视图类CDemoView的包含文件:

#include"DemoView.h"(6)编译并运行,结果如图所示。7.7.3切分窗口4.动态切分窗口实现通过添加切分窗口组件来创建动态切分(1)

创建默认的单文档应用程序Ex_DySplit。(2)

选择“工程”→“添加工程”→“ComponentsandControls”,弹出如图所示的“组件和控件”对话框。(3)

双击“VisualC++Components”,出现VisualC++支持的组件,选中SplitterBar。7.7.3切分窗口(4)

单击[Insert]按钮,出现一个消息对话框,询问是否要插入SplitterBar组件,单击[确定]按钮。从中可选择切分类型:Horizontal(水平切分)、Vertical(垂直切分)和Both(水平垂直切分)。(5)

选中Both选项,单击[OK]按钮,回到图6.21对话框,单击[结束]按钮,动态切分就被添加到单文档应用程序的主框架窗口类CMainFrame中。(6)

编译运行,结果如图6.23所示。垂直切分块水平切分块7.7.3切分窗口7.7.4一档多视1.一档多视模式MFC对于“一档多视”提供下列3个模式:(1)

MDI文档窗口:同一个视图类的多个视图对象。用户有时需要应用程序能为同一个文档打开另一个文档窗口,以便能同时使用两个文档窗口来查看文档的不同部分内容。用MFCAppWizard创建的多文档应用程序支持这种模式。(2)

切分窗口机制:在同一个文档窗口中包含同一个视图类的多个视图对象。实际上是使用“切分窗口”机制使SDI应用程序具有多视的特征。(3)

在单独一个文档窗口中包含不同视图类的多个视图对象:在该模式下,多个视图共享同一个文档窗口。它有点象“切分窗口”,但由于视图可由不同的视图类构造,所以同一个文档可以有不同的显示方法。例如,同一个文档可同时有文字显示方式及图形显示方式的视图。2.示例在一个多文档应用程序Ex_Rect中:为同一个文档数据提供两种不同的显示和编辑方式。在左边的窗格中,用户可以调整小方块在右边窗格的坐标位置。而若在右边窗格中任意单击鼠标,相应的小方块会移动到当前鼠标位置处,且左边窗格的编辑框内容也随之发生改变。7.7.4一档多视[例Ex_Rect]一档多视示例(1)创建表单应用程序,设计表单

1)创建一个多文档应用程序Ex_Rect。在第6步中将基类选择为CFormView。

2)打开表单模板资源IDD_EX_RECT_FORM,调整表单模板大小,并依次添加如表6.15所示的控件。7.7.4一档多视3)打开MFCClassWizard的MemberVariables标签,在Classname中选择CEx_RectView,选中所需的控件ID号,双击鼠标或单击AddVariables按钮。依次为表6.16中的控件添加成员变量。表6.16添加的控件变量7.7.4一档多视(2)添加CEx_RectDoc和CEx_RectView类代码1)在CEx_RectDoc类中添加一个公有型的CPoint数据成员m_ptRect,用于记录小方块的位置。CEx_RectDoc::CEx_RectDoc(){

m_ptRect.x=m_ptRect.y=0;//或m_ptRect=CPoint(0,0)}2)在CEx_RectDoc类的构造函数中添加如下代码。7.7.4一档多视voidCEx_RectView::OnChangeEdit(){ UpdateData(TRUE); CEx_RectDoc*pDoc=(CEx_RectDoc*)GetDocument(); pDoc->m_ptRect.x=m_CoorX; pDoc->m_ptRect.y=m_CoorY; CPointpt(m_CoorX,m_CoorY); pDoc->UpdateAllViews(NULL,2,(CObject*)&pt);}3)为编辑框IDC_EDIT1和IDC_EDIT2添加EN_CHANGE的消息映射,使它们的映射函数名都设为OnChangeEdit,并添加下列代码:7.7.4一档多视4)添加OnUpdate的消息函数,并添加下列代码:voidCEx_RectView::OnUpdate(CView*pSender,LPARAMlHint,CObject*pHint){if(lHint==1) {CPoint*pPoint=(CPoint*)pHint;m_CoorX=pPoint->x;m_CoorY=pPoint->y;UpdateData(FALSE); //在控件中显示

CEx_RectDoc*pDoc=(CEx_RectDoc*)GetDocument();pDoc->m_ptRect=*pPoint;//保存在文档类中的m_ptRect}}7.7.4一档多视6)这时编译并运行程序,程序会出现一个运行错误。需要进行一些处理。5)在CEx_RectView::OnInitialUpdate中添加一些初始化代码:voidCEx_RectView::OnInitialUpdate(){CFormView::OnInitialUpdate();ResizeParentToFit();CEx_RectDoc*pDoc=(CEx_RectDoc*)GetDocument();m_CoorX=pDoc->m_ptRect.x;m_CoorY=pDoc->m_ptRect.y;m_SpinX.SetRange(0,1024); m_SpinY.SetRange(0,768);UpdateData(FALSE);}7.7.4一档多视(3)处理旋转按钮控件的运行错误

1)为CEx_RectView添加一个BOOL型的成员变量m_bEditOK。

2)在CEx_RectView构造函数中将m_bEditOK的初值设为FALSE。

3)在OnInitialUpdate函数的最后将m_bEditOK置为TRUE.voidCEx_RectView::OnInitialUpdate(){…UpdateData(FALSE);m_bEditOK=TRUE;}

7.7.4一档多视voidCEx_RectView::OnChangeEdit(){if(!m_bEditOK)return;…}7.7.4一档多视4)在CEx_RectView::OnChangeEdit函数的最前面添加下列语句:(4)

新增CDrawView类,添加框架窗口切分功能1)用MFCClassWizard添加一个新的CView的派生类CDrawView。2)用MFCClassWizard为CChildFrame类添加OnCreateClient函数的重载BOOLCChildFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){ CRectrect; GetWindowRect(&rect); BOOLbRes=m_wndSplitter.CreateStatic(this,1,2);//创建2个水平静态窗格

m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CEx_RectView),CSize(0,0),pContext); m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDrawView),CSize(0,0),pContext);m_wndSplitter.SetColumnInfo(0,rect.Width()/2,10); //设置列宽

m_wndSplitter.SetColumnInfo(1,rect.Width()/2,10);m_wndSplitter.RecalcLayout(); //重新布局

returnbRes;//CMDIChildWnd::OnCreateClient(lpcs,pContext);}7.7.4一档多视3)在ChildFrm.cpp的前面添加下列语句:

#include"ChildFrm.h"#include"Ex_RectView.h"#include"DrawView.h"4)打开ChildFrm.h文件,为CChildFrame类添加成员变量:

public: CSplitterWnd m_wndSplitter;7.7.4一档多视5)此时编译,程序会有一些错误。这些错误的出现是基于这样的一些事实:在用标准C/C++设计程序时,有一个原则即两个代码文件不能相互包含,而且多次包含还会造成重复定义的错误。6)打开Ex_RectView.h文件,在classCEx_RectView:publicCForm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论