OLE项目出入数据表控制方法设计说明书.doc_第1页
OLE项目出入数据表控制方法设计说明书.doc_第2页
OLE项目出入数据表控制方法设计说明书.doc_第3页
OLE项目出入数据表控制方法设计说明书.doc_第4页
OLE项目出入数据表控制方法设计说明书.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

OLE项目出入数据表控制方法设计说明书1 需求分析1.1 设计需求随着计算机技术应用的普及,对于文件的管理要求也越来越高 ,因此设计一个能够管理Word文档和Excel文档文件管理器是非常有必要的。本次课题是设计思想是把一个Word文档或Excel文档数据写入数据表,或从数据表把一个Word或Excel文档读入到应用程序文档;并且在应用程序中嵌入Word或Excel应用程序界面。首先进行复合文档操控基本实验,体会OLE(对象链接与嵌入)项目的使用方法:插入一个OLE对象,激活OLE对象,提取OLE对象的文档数据。再使用框架客户区切分方法进行应用程序的界面设计。将应用程序主框架客户区设计为:文档类型视图、数据表视图、OLE项目视图(OLE项目激活窗口)。当文档类型视图确定一种文档类型后,存在于数据表中的此类文档行全部罗列于数据表视图的表格控件中;当双击表格控件的数据行时,从数据表中读取一个OLE项目数据,并在位激活。所以还要按类型编码、文档编号、文档摘要、文档录入日期、文档数据量和文档数据创建Access数据表。在应用程序的功能设计方面,要求应用程序能够对文档进行设计新建文档、保存文档、删除文档功能。1.2 设计思路此次课程设计的应用程序界面应该包含有三大视图: 文档类型视图、数据表视图、OLE项目视图。如下图所示。图1-1 应用程序界面模式(1)文档类型视图区设置为一个CTreeCtrl视图对象(树型视图),把文档类型分为如下三种:普通文档类(01):Word文档(01);Excel文档(02);技术文档类(02):Word文档(01);Excel文档(02);重要文档类(03):Word文档(01);Excel文档(02);(2)数据表视图区设置一个CMSFlexGrid模式视图对象,数据项包括:文档类型码;文档摘要;文档录入时间;文档数据量/M。(3)OLE项目视图区用于显视当前激活的OLE项服务服务窗口中,在没有OLE项目激活时为应用程序视图,即CVckcsj09View类对象。Visual C+程序设计语言中为用户集成了COleDocument文档类,此类的作用为管理和操控其他应用程序的文档,即COleDocument类是复合文档类(容器文档类),它可以包容Word、Excel等其它应用程序的文档,被容入的文档对象称为OLE项目。也就是说如果COleDocument类对象包容有Word或Excel的文档,那么就可以在其视图中激活其文档对应的服务程序调入并运行Word或Excel文档对象所对应的Word或Excel程序来处理文档。假设我们在COleDocument类对象中嵌入的OLE项目是一个Word的文档,就可以在应程序的视图中激活Word应用程序来编辑OLE项目数据。如果新建一个OLE项目文档时,当在文档类型视图确定一种文档类型后,会在数据表视图的CMSFlexGrid控件窗口中增加一条数据行记录,并自动确定该文档的文档编号,然后选择所要创建的文档类型,这样相应的服务程序在应用程序视图中被激活了,我们也就能通过该应用程序来编辑OLE项目数据。在保存文档数据时,从COleDocument类对象找出当前操作的OLE项目,使用数据串行化功能,获得OLE项目的文档数据,将文档数据写入我们指定的介质中。如果需从存储介质中读取一个OLE项目文档,仍然是通过OLE项目的串行化功能读回数据,并嵌入到应用程序文档中,同时进行在位激活工作。为了给文档管理器应用程序提供一个Word或Excel文档的保存介质,我们使用Access数据表,我们把Word或Excel应用程序的文档数据写入数据表中,或从表中把文档数据读入应用程序的COleDocument类对象中。1.3用户操作控制流程当文档类型视图中树型控件选项发生改变,提取由父项与子项文本前个数字组成4字符的类型码,将这个类型码发送给数据表视图窗口,或直接调用数据表视图的函数,数据表视图从数据表中找出与类型码一致的所有数据行,并显示到数据表视图的CMSFlexGrid控件窗口中。当数据表视图的CMSFlexGrid控件的行上发生双击事件,则从数据表中读取OLE项目文档数据进入应用程序文档,由于OLE项目视图为CVckcsj09View类对象,所以应用程序文档中的OLE项目的服务程序只能在这个视图区域内激活。需要保存当前激活的OLE项目时,先将一个OLE项数据数据通过其自身的Serialize函数读取数据到共享文件里,然后将共享文件写入数据表中。2 功能设计与实现方法2.1总体功能结构图文档管理系统应用程序架构应用程序直接读入文档OLE项目服务功能将OLE项目写为文档文件用户操作控制功能图2-1总体功能结构图2.2 应用程序直接读入文档文件运行应用程序之后,鼠标左键单击菜单栏的“文件”选项,然后选择下拉框中的“打开”选项,然后就可以打开指定路径下的指定的文件,这一功能的完成是通过在文档类中捕获菜单ID_FILE_OPEN消息,建立其消息响应函数void COleDDoc:OnFileOpen()来实现的,该消息响应函数的实现代码如下所示:void COleDDoc:OnFileOpen() /首先找出视图POSITION pos=GetFirstViewPosition();CView* pView=NULL;COleDView* pViewObj=NULL;while(pos)pView=GetNextView(pos);if(pView-IsKindOf(RUNTIME_CLASS(COleDView)pViewObj=(COleDView*)pView;break;if(pViewObj=NULL)return;CString DocFileName;CFileDialogfile(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Word文档(*.Doc)|*.Doc|);if(file.DoModal()=IDOK)DocFileName=file.GetPathName();elsereturn;COleDCntrItem* pItem = NULL;TRY/ Create new item connected to this document.pItem = new COleDCntrItem(this);pItem-CreateFromFile(DocFileName);/根据文档文件建立OLE项目/如果视图对象的OLE项目指针不为空,则删除if(pViewObj-m_pSelection)pViewObj-m_pSelection-Close();pViewObj-m_pSelection-Delete();delete pViewObj-m_pSelection;pViewObj-m_pSelection=pItem;/激活OLE项目的服务程序pItem-DoVerb(OLEIVERB_SHOW, pViewObj);UpdateAllViews(NULL);/更新文档视图CATCH(CException, e)if (pItem != NULL)ASSERT_VALID(pItem);pItem-Delete();AfxMessageBox(IDP_FAILED_TO_CREATE);END_CATCH调试代码无误后,运行该程序,当应用程序打开文件时该函数得以调用,将确定的文档文件数据作为OLE项目数据。2.3 将OLE项目写为文档文件如何将一个确定的OLE项目保存为一个文档文件呢,我们可以从视图类(COleDView)OnDraw函数中的代码if (m_pSelection = NULL)POSITION pos = pDoc-GetStartPosition();m_pSelection=(COleDCntrItem*)pDoc-GetNextClientItem(pos);可以看出:复合文档内部使用了一个链表(m_pSelection)来管理应用程序插入的所有COleClientItem类对象(OLE项目),每一个OLE项目对象的数据格式为:OLE项目信息头(22Byte)项目文档。将OLE项目直接写为文档文件就需要丢掉OLE项目信息头,只保存项目文档即可,但是当OLE项目数据写入文件时必须知道数据的长度,不知道数据长度是没有有办法写入文件的。该程序中运用了内存共享文件与二进制数据流串行化的操作方法,先将一个OLE项数据数据通过其自身的Serialize函数写入一个共享文件,共享文件使用全局内存,并自动申请占用内存的大小,然后获取共享文件的长度,从共享文件的长度中减去22字节的偏移量,就是纯文档数据。这一功能的具体实现过程是,在应用程序的文档COleDDoc类中捕获ID_FILE_SAVE_AS菜单消息,然后在它的消息响应函数中添加代码如下:void COleDDoc:OnFileSaveAs() /首先找出视图POSITION pos=GetFirstViewPosition();CView* pView=NULL;COleDView* pViewObj=NULL;while(pos)pView=GetNextView(pos);if(pView-IsKindOf(RUNTIME_CLASS(COleDView)pViewObj=(COleDView*)pView;break;if(pViewObj=NULL|pViewObj-m_pSelection=NULL)return;CString FileName=E:TestChen.Doc;CFileDialog file(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,Word文档(*.Doc)|*.Doc|);if(file.DoModal()=IDOK)FileName=file.GetPathName();elsereturn;/设置共享文件对象,内存共享,数据可移动,数据增长量8字节CSharedFile SharedFile(GMEM_DDESHARE|GMEM_MOVEABLE,8);/设置CArchive对象ar,目的是获OLE项目数据CArchive ar(&SharedFile,CArchive:store);pViewObj-m_pSelection-Serialize(ar);/ar与共享文件分离ar.Flush();ar.Close();if(SharedFile.GetLength()0)/获取共享文件的内存句柄HGLOBAL m_hGlobalMemory=SharedFile.Detach();/锁定全局内存句柄,获取句柄对应的内存地址LPVOID lpBuf = :GlobalLock(m_hGlobalMemory);ASSERT(lpBuf != NULL);/内存偏移18获得OLE对象数据的长度DWORD* plen=(DWORD*)(char*)lpBuf+18);DWORD len=*plen;CFile WordFile;/创建保存文件对象if(WordFile.Open(FileName,CFile:modeCreate|CFile:modeWrite)char *pBuf=(char*)lpBuf;WordFile.WriteHuge(pBuf+sizeof(DWORD),len);WordFile.Close();/解锁句柄,让其他用户可以访问这段内存:GlobalUnlock(m_hGlobalMemory);/释放全局内存:GlobalFree(m_hGlobalMemory);复合文档COleDDoc类对象使用链表管理COleDCntrItem类对象,每一个COleDCntrItem类对象就是插入到应用程序文档的一个OLE项目对象。该课题设计首先针对一个COleDCntrItem类对象的插入,打开和保存功能进行了设计说明,并给出了实现代码。2.4 从数据表中读出OLE项目如果需要将CTypeObjGridView类的当前行对应的OLE项目数据读入到应用程序文档采用什么办法?由当前类型编码与从当前行取出文档编号组成数据表查询关键字,确定数表中的OLE项目数据,通过以下函数读取。BOOL CTypeObjGridView:LoadOleObj(CString TypeCode)extern CString mdb_File_Name;CCyzAdo ado;if(!ado.AdoConnectByName(mdb_File_Name)return FALSE;CString strSQL;strSQL.Format(Select * From 文档对象 WHERE 类型编码+文档编号=%s,TypeCode);ado.AdoOpenTab(strSQL);if(ado.m_pRs-GetAdoEOF()|ado.m_pRs-GetAdoBOF()return FALSE;CSharedFile file;ado.ReadBLOB(file,文档数据);CVckcsj09Doc* pDoc=(CVckcsj09Doc*)GetDocument();CVckcsj09View* pView=(CVckcsj09View*)pDoc-FindTargetView(RUNTIME_CLASS(CVckcsj09View);if(!pView)return FALSE;pView-DeleteCurentOleItem();pView-m_pSelection = new CVckcsj09CntrItem(pDoc);ASSERT_VALID(pView-m_pSelection);if(pView-m_pSelection)CArchive ar(&file,CArchive:load);pView-m_pSelection-Serialize(ar);pView-m_pSelection-DoVerb(OLEIVERB_SHOW, pView);pView-Invalidate();return TRUE;return FALSE;引发读取数据表OLE项目数据,最简捷的方法是表格控件的双击事件。2.5 新建OLE项目文档新建OLE项目文档应利用应用程序的菜单资源ID_FILE_NEW,因为这个资源ID已经存在,而且其工具按钮已建好。注意原来ID_FILE_NEW的消息响应函数ON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew) 建在CWinApp类中,应该将其取消,而重新建在CTypeObjGridView类中。每新加一个新的OLE项目文档涉及在表格控件中添加一行和OLE项目的对象选择问题,一个新的OLE项目又牵涉在那一个视图中激活问题。这个功能的实现,需要大家认真从程序代码的调试中确定最好的方法,这里也给出一段参考代码:void CTypeObjGridView:OnFileNew() if(m_szCurent_TypeCode.IsEmpty()AfxMessageBox(没有文档管理类型!);return;int nRows=m_OleObjGrid.GetRows();int nCols=m_OleObjGrid.GetCols();int nRow=0;/自动确定文档编号CString Code=0001;if(nRows1)Code=m_OleObjGrid.GetTextArray(nRows-1)*nCols+1);sscanf(Code,%d,&nRow);nRow+;Code.Format(%04d,nRow);nRows+=1;m_OleObjGrid.SetRows(nRows);m_OleObjGrid.SetTextArray(nRows-1)*nCols+1,Code);/取日期CTime Date=CTime:GetCurrentTime();Code=Date.Format(%Y-%m-%d);/将日期填入表格控件m_OleObjGrid.SetTextArray(nRows-1)*nCols+3,Code);for(int i=1;iFindTargetView(RUNTIME_CLASS(CVckcsj09View);if(pView)pView-SendMessage(WM_COMMAND,ID_OLE_INSERT_NEW,0);3 代码调试步骤与注释3.1应用程序界面与OLE项目服务程序界面共生只要OLE对象激活,OLE项目的服务程序就融入到应用程序中,而且他们的菜单和工具条共生于应用程序界面中。BEGIN_INTERFACE_MAP(CMydocCntrItem,COleClientItem) INTERFACE_PART(CMydocCntrItem,IID_IOleDocumentSite,OleDocumentSite)END_INTERFACE_MAP()STDMETHODIMP_(ULONG) CMydocCntrItem:XOleDocumentSite:AddRef()METHOD_PROLOGUE_EX(CMydocCntrItem,OleDocumentSite)return pThis-ExternalAddRef();STDMETHODIMP_(ULONG) CMydocCntrItem:XOleDocumentSite:Release()METHOD_PROLOGUE_EX (CMydocCntrItem,OleDocumentSite)return pThis-ExternalRelease();STDMETHODIMP CMydocCntrItem:XOleDocumentSite:QueryInterface(REFIID iid,void* ppvObj)METHOD_PROLOGUE_EX (CMydocCntrItem,OleDocumentSite)return pThis-ExternalQueryInterface(&iid,ppvObj);STDMETHODIMP CMydocCntrItem:XOleDocumentSite:ActivateMe(LPOLEDOCUMENTVIEW pDocView)IOleInPlaceSite* pIOleInPlaceSite;METHOD_PROLOGUE_EX(CMydocCntrItem,OleDocumentSite);pThis-InternalQueryInterface(&IID_IOleInPlaceSite,(void*)&pIOleInPlaceSite);if(pDocView=NULL)if(FAILED(pThis-m_lpObject-QueryInterface(IID_IOleDocument,(void*)&(pThis-m_pDoc)return E_FAIL;if(FAILED(pThis-m_pDoc-CreateView(pIOleInPlaceSite,NULL,0,&pDocView)return E_OUTOFMEMORY;pThis-m_pDoc-Release();elsepDocView-AddRef();pThis-m_pWordView=pDocView;RECT rect;pDocView-UIActivate(TRUE);pDocView-GetRect(&rect);pThis-GetActiveView()-GetClientRect(&rect);pDocView-SetRect(&rect);pDocView-Show(TRUE);return NOERROR;3.2 文档类型视图CTypeTreeView类设计建立CTreeView类,直接由New Class类向导,从CTreeView类派生一个新类CTypeTreeView,创建新类后在类的定义中首先观察这个宏DECLARE_DYNCREATE(CTypeTreeView)是否存在?其次在实现文件中观察IMPLEMENT_DYNCREATE(CTypeTreeView, CTreeView)宏是否存在?,这两个宏的作用是,在主框架的OnCreateClient函数中需要使用RUNTIME_CLASS宏找出指定类名的类名指针,由类的静态函数CreateObject创建视图对象,没有上述两个宏,静态函数CreateObject就不可能存在,也就不可能由OnCreateClient函数创建指定视图类名的对象;再一个在CTypeTreeView类的定义中是否包含了DECLARE_MESSAGE_MAP()这个宏,它是建立消息映射的关键宏,与实现文件中的这一段宏是配套的,缺一不可。BEGIN_MESSAGE_MAP(CTypeTreeView, CTreeView)/AFX_MSG_MAP(CTyepTreeView)ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)/AFX_MSG_MAPEND_MESSAGE_MAP()由于CTypeTreeView类从CTreeView派生的,CTreeView类的定义包含于Afxcview.h中,因此在CTypeTreeView类的定义文件中一定要include。为了使用CTypeTreeView类中树型控件的风格与要求的一致,需要重载PreCreateWindow(CREATESTRUCT& cs)这个虚函数,来改变树型控件的风格。BOOL CTypeTreeView:PreCreateWindow(CREATESTRUCT& cs) cs.style|=TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_TRACKSELECT|TVS_HASBUTTONS;return CTreeView:PreCreateWindow(cs);为加入应用程序的文档类型条目,需要重载OnInitialUpdate()函数,这个函数的作用从其函数名就可以知道,初始化更新,即CTypeTreeView类的窗口建立后自动调用的函数。void CTypeTreeView:OnInitialUpdate() CTreeView:OnInitialUpdate();CTreeCtrl & Ctrl=GetTreeCtrl();HTREEITEM hParent=Ctrl.InsertItem(01普通文档类,0,0,TVI_ROOT);Ctrl.InsertItem(01Word文档,0,0,hParent);Ctrl.InsertItem(02Excel文档,0,0,hParent);Ctrl.Expand(hParent,TVE_EXPAND);hParent=Ctrl.InsertItem(02技术文档类,0,0,TVI_ROOT);Ctrl.InsertItem(01Word文档,0,0,hParent);Ctrl.InsertItem(02Excel文档,0,0,hParent);Ctrl.Expand(hParent,TVE_EXPAND);hParent=Ctrl.InsertItem(03重要文档类,0,0,TVI_ROOT);Ctrl.InsertItem(01Word文档,0,0,hParent);Ctrl.InsertItem(02Excel文档,0,0,hParent);Ctrl.Expand(hParent,TVE_EXPAND);这样构建出的类简洁了很多,而且窗口位置、大小根本不用考虑。他会随父窗口的变化而变化。虽然应用程序管理的文档类型条目加入了树型控件,但是还必须捕获到用户对条目的点击情况产生需要的文档类型编码(4数字字符)。实现的方法是捕获CTypeTreeView类的TVN_SELCHANGED消息,即当用户改变了树型控件中的条目,则由系统发出这个消息,捕获到个这消息调用其对应的消息响应函数。void CTypeTreeView:OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;CTreeCtrl & Ctrl=GetTreeCtrl();*pResult = 0;CString TypeCode,ls;HTREEITEM& hOldTree=pNMTreeView-itemOld.hItem;HTREEITEM& hNewTree=pNMTreeView-itemNew.hItem;HTREEITEM hParent=Ctrl.GetParentItem(hNewTree);if(hParent)ls=Ctrl.GetItemText(hParent);TypeCode=ls.Left(2);ls=Ctrl.GetItemText(hNewTree);TypeCode+=ls.Left(2);AfxMessageBox(TypeCode);/暂时给出消息框,看到产生的文档类型码*pResult = 0;3.3 数据表视图CTypeObjGridView类设计CMSFlexGrid控件的编程方法。应注意从对话框资源模板导出视图类时,基类不能选CDialog类,而选CFormView类。当CTypeObjGridView类生成以后,在主框架类的OnCreateClient函数中找到CTypeObjGridView类名应放的位置,以及应包含的头文件。需要为此类的CMSFlexGrid成员引入列名,这个工作是重载CTypeObjGridView类的OnInitialUpdate()函数。void CTypeObjGridView:OnInitialUpdate() CFormView:OnInitialUpdate();CString szItem5=序号,文档编号,文档摘要,文档录入日期,文档数据量;int Wides5=500,900,7500,1200,1200;m_OleObjGrid.SetRows(11);m_OleObjGrid.SetCols(5);for(int i=0;icx,lpwndpos-cy);当树型控件(CTypeTreeView类对象)的选项发生改变后,把由父项与子项条目决定的文档类型码发送给数据表视图(CTypeObjGridView类对象),或直接传给数据表视图,采用什么办法因人而异,其实应用程序文档对象是知道应用程序客户区所建的这三个视图对象的,因为主框架的OnCreateClient函数在创建三个视图时,已经将文档对象传给了三个视图对象,所以应该使用应用程序的文档对象作为数据传递的中转站,通过文档找到数据到达的目标视图对象,然后实施数据传递。例如,在文档类中添加一个查找目标视图对象的函数,只给出目标视图的类名指针,找出存在的目标视图对象。CView* COleDDoc:FindTargetView(CRuntimeClass *pClass)POSITION pos=GetFirstViewPosition();while(pos)CView* pView=GetNextView(pos);if(pView-IsKindOf(pClass)return pView;return NULL;这样可以把函数void CTypeTreeView:OnSelchanged的代码修改为:void CTypeTreeView:OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;CTreeCtrl & Ctrl=GetTreeCtrl();*pResult = 0;CString TypeCode,ls;HTREEITEM& hOldTree=pNMTreeView-itemOld.hItem;HTREEITEM& hNewTree=pNMTreeView-itemNew.hItem;HTREEITEM hParent=Ctrl.GetParentItem(hNewTree);if(hParent)ls=Ctrl.GetItemText(hParent);TypeCode=ls.Left(2);ls=Ctrl.GetItemText(hNewTree);TypeCode+=ls.Left(2);COleDDoc* pDoc=(COleDDoc*)GetDocument();CTypeObjGridView* pTargetView=(CTypeObjGridView*)pDoc-FindTargetView(RUNTIME_CLASS(CTypeObjGridView);if(pTargetView)pTargetView-LoadOleObjFromTab(TypeCode);/根据类型码从数据表读出数据行*pResult = 0;当树型控件的选项发生改变,获得新的类型码后直接调用CTypeObjGridView类的LoadOleObjFromTab(TypeCode)函数,把数据表中的相关数据行显示于表格控件中。3.4 引入CCyzAdo类访问数据库使用Ado技术访问数据库,CCyzAdo类是教学时老师介绍给我们的集成了使用Ado技术访问数据库的基本方法,我们也可以在这个基础上进行修改。桌面数据库Access相对SQL_Server数据库操控简单一些,它另一个优势是不需要数据库环境就可访问。针对本课题,我们建立一个DocManager.mdb数据库,其中仅设置一张ObjData数据表,此表的数据字段设置见表5.1。由数据表的字段可以看出,文档数据是一个大二进数据段,在CCyzAdo类中已有大二进数据出入数据表的方法。表5.1 ObjData表字段属性序号字段名称数据类型数据长度1类型编码文本42文档编号文本43文档摘要文本2554文档录入日期日期/时间85文档数据量数字/单精度86文档数据OLE对象应用程序所访问的数据库名必须写入注册表中,当应用程序运行时从注册表中提取,不需要每次运行让用户去设置,下面一段参考代码来实现这个目的,我们应该把这个代码放到程序初始化的位置,即BOOL COleDApp:InitInstance()函数中。SetRegistryKey(_T(OleDoc);mdb_File_Name=GetProfileString(Settings, 数据库, DocManager.mdb);CFileFind ff;BOOL res=ff.FindFile(mdb_File_Name);CFile file;if(!res)CFileDialog Dfile(TRUE,NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,Access数据库(*.mdb)|*.mdb|);if(Dfile.DoModal()=IDOK)mdb_Fil

温馨提示

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

评论

0/150

提交评论