OLE項(xiàng)目出入數(shù)據(jù)表控制方法設(shè)計(jì)說明書_第1頁
OLE項(xiàng)目出入數(shù)據(jù)表控制方法設(shè)計(jì)說明書_第2頁
OLE項(xiàng)目出入數(shù)據(jù)表控制方法設(shè)計(jì)說明書_第3頁
OLE項(xiàng)目出入數(shù)據(jù)表控制方法設(shè)計(jì)說明書_第4頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、OLE項(xiàng)目出入數(shù)據(jù)表控制方法設(shè)計(jì)說明書1 需求分析1.1設(shè)計(jì)需求隨著計(jì)算機(jī)技術(shù)應(yīng)用的普及,對(duì)于文件的管理要求也越來越高,因此設(shè)計(jì)一個(gè)能夠管理 Word文檔和 Excel 文檔文件管理器是非常有必要的。本次課題是設(shè)計(jì)思想是把一個(gè) Word文檔或 Excel 文檔數(shù)據(jù)寫入數(shù)據(jù)表,或從數(shù)據(jù)表把一個(gè) Word或 Excel 文檔讀入到應(yīng)用程序文檔;并且在應(yīng)用程序中嵌入 Word或 Excel 應(yīng)用程序界面。首先進(jìn)行復(fù)合文檔操控基本實(shí)驗(yàn), 體會(huì) OLE(對(duì)象與嵌入) 項(xiàng)目的使用方法:插入一個(gè) OLE對(duì)象,激活 OLE對(duì)象,提取 OLE對(duì)象的文檔數(shù)據(jù)。 再使用框架客戶區(qū)切分方法進(jìn)行應(yīng)用程序的界面設(shè)計(jì)。 將

2、應(yīng)用程序主框架客戶區(qū)設(shè)計(jì)為: 文檔類型視圖、數(shù)據(jù)表視圖、 OLE項(xiàng)目視圖( OLE項(xiàng)目激活窗口)。當(dāng)文檔類型視圖確定一種文檔類型后,存在于數(shù)據(jù)表中的此類文檔行全部羅列于數(shù)據(jù)表視圖的表格控件中;當(dāng)雙擊表格控件的數(shù)據(jù)行時(shí), 從數(shù)據(jù)表中讀取一個(gè) OLE項(xiàng)目數(shù)據(jù), 并在位激活。所以還要按類型編碼、文檔編號(hào)、文檔摘要、文檔錄入日期、文檔數(shù)據(jù)量和文檔數(shù)據(jù)創(chuàng)建 Access 數(shù)據(jù)表。在應(yīng)用程序的功能設(shè)計(jì)方面,要求應(yīng)用程序能夠?qū)ξ臋n進(jìn)行設(shè)計(jì)新建文檔、保存文檔、刪除文檔功能。1.2設(shè)計(jì)思路此次課程設(shè)計(jì)的應(yīng)用程序界面應(yīng)該包含有三大視圖:文檔類型視圖、數(shù)據(jù)表視圖、 OLE項(xiàng)目視圖。如下圖所示。.專業(yè) .專注 .圖

3、1-1 應(yīng)用程序界面模式(1) 文檔類型視圖區(qū)設(shè)置為一個(gè) CTreeCtrl 視圖對(duì)象(樹型視圖),把文檔類型分為如下三種:普通文檔類 (01):Word文檔 (01); Excel 文檔 (02);技術(shù)文檔類 (02):Word文檔 (01); Excel 文檔 (02);重要文檔類 (03):Word文檔 (01); Excel 文檔 (02);(2) 數(shù)據(jù)表視圖區(qū)設(shè)置一個(gè) CMSFlexGrid 模式視圖對(duì)象,數(shù)據(jù)項(xiàng)包括:文檔類型碼;文檔摘要;文檔錄入時(shí)間;文檔數(shù)據(jù)量 /M。(3)OLE 項(xiàng)目視圖區(qū)用于顯視當(dāng)前激活的OLE項(xiàng)服務(wù)服務(wù)窗口中,在沒有 OLE項(xiàng)目激活時(shí)為應(yīng)用程序視圖,即CVc

4、kcsj09View 類對(duì)象。Visual C+ 程序設(shè)計(jì)語言中為用戶集成了COleDocument文檔類,此類的作用為管理和操控其他應(yīng)用程序的文檔,即COleDocument類是復(fù)合文檔類(容器文檔類),它可以包容 Word、Excel 等其它應(yīng)用程序的文檔,被容入的文檔對(duì)象稱為 OLE項(xiàng)目。也就是說如果 COleDocument類對(duì)象包容有 Word或 Excel 的文檔,那么就可以在其視圖中激活其文檔對(duì)應(yīng)的服務(wù)程序調(diào)入并運(yùn)行Word 或Excel 文檔對(duì)象所 對(duì)應(yīng)的 Word 或 Excel 程序來處理文檔 。 假 設(shè)我們?cè)贑OleDocument類對(duì)象中嵌入的 OLE項(xiàng)目是一個(gè) Wor

5、d的文檔,就可以在應(yīng)程序的視圖中激活 Word應(yīng)用程序來編輯 OLE項(xiàng)目數(shù)據(jù)。如果新建一個(gè) OLE項(xiàng)目文檔時(shí),當(dāng)在文檔類型視圖確定一種文檔類型后, 會(huì)在數(shù)據(jù)表視圖的 CMSFlexGrid 控件窗口中增加一條數(shù)據(jù)行記錄, 并自動(dòng)確定該文檔的文檔編號(hào), 然后選擇所要?jiǎng)?chuàng)建的文檔類型, 這樣相應(yīng)的服務(wù)程序在應(yīng)用程序視圖中被激活了, 我們也就能通過該應(yīng)用程序來編輯 OLE項(xiàng)目數(shù)據(jù)。在保存文檔.專業(yè) .專注 .數(shù)據(jù)時(shí),從 COleDocument類對(duì)象找出當(dāng)前操作的 OLE項(xiàng)目,使用數(shù)據(jù)串行化功能,獲得 OLE項(xiàng)目的文檔數(shù)據(jù), 將文檔數(shù)據(jù)寫入我們指定的介質(zhì)中。 如果需從存儲(chǔ)介質(zhì)中讀取一個(gè) OLE項(xiàng)目文檔

6、,仍然是通過 OLE項(xiàng)目的串行化功能讀回?cái)?shù)據(jù),并嵌入到應(yīng)用程序文檔中, 同時(shí)進(jìn)行在位激活工作。 為了給文檔管理器應(yīng)用程序提供一個(gè) Word或 Excel 文檔的保存介質(zhì),我們使用 Access 數(shù)據(jù)表,我們把 Word或 Excel 應(yīng)用程序的文檔數(shù)據(jù)寫入數(shù)據(jù)表中, 或從表中把文檔數(shù)據(jù)讀入應(yīng)用程序的 COleDocument類對(duì)象中。1.3 用戶操作控制流程當(dāng)文檔類型視圖中樹型控件選項(xiàng)發(fā)生改變, 提取由父項(xiàng)與子項(xiàng)文本前個(gè)數(shù)字組成 4 字符的類型碼, 將這個(gè)類型碼發(fā)送給數(shù)據(jù)表視圖窗口, 或直接調(diào)用數(shù)據(jù)表視圖的函數(shù),數(shù)據(jù)表視圖從數(shù)據(jù)表中找出與類型碼一致的所有數(shù)據(jù)行, 并顯示到數(shù)據(jù)表視圖的 CMSF

7、lexGrid 控件窗口中。當(dāng)數(shù)據(jù)表視圖的 CMSFlexGrid 控件的行上發(fā)生雙擊事件, 則從數(shù)據(jù)表中讀取OLE項(xiàng)目文檔數(shù)據(jù)進(jìn)入應(yīng)用程序文檔, 由于 OLE項(xiàng)目視圖為 CVckcsj09View 類對(duì)象,所以應(yīng)用程序文檔中的 OLE項(xiàng)目的服務(wù)程序只能在這個(gè)視圖區(qū)域激活。需要保存當(dāng)前激活的 OLE項(xiàng)目時(shí),先將一個(gè) OLE項(xiàng)數(shù)據(jù)數(shù)據(jù)通過其自身的 Serialize 函數(shù)讀取數(shù)據(jù)到共享文件里,然后將共享文件寫入數(shù)據(jù)表中。.專業(yè) .專注 .2 功能設(shè)計(jì)與實(shí)現(xiàn)方法2.1 總體功能結(jié)構(gòu)圖文檔管理系統(tǒng)應(yīng)用程序架構(gòu)應(yīng)用程序直接OLE將 OLE 項(xiàng)目用戶操作控制讀入文檔項(xiàng)目服務(wù)功寫為文檔 文功能圖 2-1

8、總體功能結(jié)構(gòu)圖2.2應(yīng)用程序直接讀入文檔文件運(yùn)行應(yīng)用程序之后,鼠標(biāo)左鍵單擊菜單欄的“文件”選項(xiàng),然后選擇下拉框中的“打開”選項(xiàng),然后就可以打開指定路徑下的指定的文件,這一功能的完成是通過在文檔類中捕獲菜單ID_FILE_OPEN消息,建立其消息響應(yīng)函數(shù)voidCOleDDoc:OnFileOpen() 來實(shí)現(xiàn)的,該消息響應(yīng)函數(shù)的實(shí)現(xiàn)代碼如下所示:void COleDDoc:OnFileOpen()/ 首先找出視圖POSITION pos=GetFirstViewPosition();CView* pView=NULL;COleDView* pViewObj=NULL;while(pos).專業(yè)

9、 .專注 .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();elser

10、eturn;COleDCntrItem* pItem = NULL;TRY/ Create new item connected to this document. pItem = new COleDCntrItem(this);pItem-CreateFromFile(DocFileName);/根據(jù)文檔文件建立OLE項(xiàng)目/ 如果視圖對(duì)象的 OLE項(xiàng)目指針不為空,則刪除if(pViewObj-m_pSelection)pViewObj-m_pSelection-Close();pViewObj-m_pSelection-Delete();delete pViewObj-m_pSelectio

11、n;pViewObj-m_pSelection=pItem;/ 激活 OLE項(xiàng)目的服務(wù)程序pItem-DoVerb(OLEIVERB_SHOW, pViewObj);UpdateAllViews(NULL);/更新文檔視圖.專業(yè) .專注 .CATCH(CException, e)if (pItem != NULL)ASSERT_VALID(pItem);pItem-Delete();AfxMessageBox(IDP_FAILED_TO_CREATE);END_CATCH調(diào)試代碼無誤后, 運(yùn)行該程序, 當(dāng)應(yīng)用程序打開文件時(shí)該函數(shù)得以調(diào)用,將確定的文檔文件數(shù)據(jù)作為OLE項(xiàng)目數(shù)據(jù)。2.3將 OLE

12、項(xiàng)目寫為文檔文件如何將一個(gè)確定的OLE 項(xiàng)目保存為一個(gè)文檔文件呢,我們可以從視圖類( COleDView)OnDraw函數(shù)中的代碼if (m_pSelection = NULL)POSITION pos = pDoc-GetStartPosition();m_pSelection=(COleDCntrItem*)pDoc-GetNextClientItem(pos);可以看出:復(fù)合文檔部使用了一個(gè)鏈表 (m_pSelection) 來管理應(yīng)用程序插入的所有 COleClientItem 類對(duì)象(OLE項(xiàng)目),每一個(gè) OLE項(xiàng)目對(duì)象的數(shù)據(jù)格式為:OLE項(xiàng)目信息頭( 22Byte )項(xiàng)目文檔。將

13、OLE項(xiàng)目直接寫為文檔文件就需要丟掉 OLE項(xiàng)目信息頭,只保存項(xiàng)目文檔即可, 但是當(dāng) OLE項(xiàng)目數(shù)據(jù)寫入文件時(shí)必須知道數(shù)據(jù)的長度, 不知道數(shù)據(jù)長度是沒有有辦法寫入文件的。 該程序中運(yùn)用了存共享文件與二進(jìn)制數(shù)據(jù)流串行化的操作方法, 先將一個(gè) OLE項(xiàng)數(shù)據(jù)數(shù)據(jù)通過其自身的 Serialize 函數(shù)寫入一個(gè)共享文件, 共享文件使用全局存, 并自動(dòng)申請(qǐng)占用存的大小,然后獲取共享文件的長度,從共享文件的長度中減去22 字節(jié)的偏移.專業(yè) .專注 .量,就是純文檔數(shù)據(jù)。 這一功能的具體實(shí)現(xiàn)過程是, 在應(yīng)用程序的文檔COleDDoc類中捕獲ID_FILE_SAVE_AS菜單消息,然后在它的消息響應(yīng)函數(shù)中添加代

14、碼如下: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:Tes

15、tChen.Doc;CFileDialog file(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Word 文檔 (*.Doc)|*.Doc|);if(file.DoModal()=IDOK)FileName=file.GetPathName();elsereturn;/ 設(shè)置共享文件對(duì)象 , 存共享 , 數(shù)據(jù)可移動(dòng) , 數(shù)據(jù)增長量 8 字節(jié)CSharedFile SharedFile(GMEM_DDESHARE|GMEM_MOVEABLE,8);/ 設(shè)置 CArchive 對(duì)象 ar, 目的是獲OLE項(xiàng)目數(shù)據(jù)CArchive

16、 ar(&SharedFile,CArchive:store);pViewObj-m_pSelection-Serialize(ar);/ar與共享文件分離.專業(yè) .專注 .ar.Flush();ar.Close();if(SharedFile.GetLength()0)/ 獲取共享文件的存句柄HGLOBAL m_hGlobalMemory=SharedFile.Detach();/ 鎖定全局存句柄 , 獲取句柄對(duì)應(yīng)的存地址LPVOID lpBuf = :GlobalLock(m_hGlobalMemory);ASSERT(lpBuf != NULL);/ 存偏移 18 獲得 OLE對(duì)象數(shù)據(jù)的

17、長度DWORD* plen=(DWORD*)(char*)lpBuf+18);DWORD len=*plen;CFile WordFile;/ 創(chuàng)建保存文件對(duì)象 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_hGl

18、obalMemory);復(fù)合文檔COleDDoc類對(duì)象使用鏈表管理COleDCntrItem 類對(duì)象,每一個(gè)COleDCntrItem 類對(duì)象就是插入到應(yīng)用程序文檔的一個(gè)OLE項(xiàng)目對(duì)象。該課題設(shè)計(jì)首先針對(duì)一個(gè)COleDCntrItem 類對(duì)象的插入,打開和保存功能進(jìn)行了設(shè)計(jì)說明,并給出了實(shí)現(xiàn)代碼。2.4從數(shù)據(jù)表中讀出OLE項(xiàng)目如果需要將 CTypeObjGridView 類的當(dāng)前行對(duì)應(yīng)的OLE項(xiàng)目數(shù)據(jù)讀入到應(yīng)用.專業(yè) .專注 .程序文檔采用什么辦法?由當(dāng)前類型編碼與從當(dāng)前行取出文檔編號(hào)組成數(shù)據(jù)表查詢關(guān)鍵字,確定數(shù)表中的OLE項(xiàng)目數(shù)據(jù),通過以下函數(shù)讀取。BOOL CTypeObjGridView

19、:LoadOleObj(CString TypeCode)extern CString mdb_File_Name;CCyzAdo ado;if(!ado.AdoConnectByName(mdb_File_Name)return FALSE;CString strSQL;strSQL.Format(Select * From 文 檔 對(duì) 象 WHERE 類 型 編 碼 + 文 檔 編 號(hào) =%s,TypeCode);ado.AdoOpenTab(strSQL);if(ado.m_pRs-GetAdoEOF()|ado.m_pRs-GetAdoBOF()return FALSE;CShared

20、File file;ado.ReadBLOB(file,文檔數(shù)據(jù) );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

21、);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;.專業(yè) .專注 .引發(fā)讀取數(shù)據(jù)表 OLE項(xiàng)目數(shù)據(jù),最簡捷的方法是表格控件的雙擊事件。2.5新建 OLE項(xiàng)目文檔新建 OLE項(xiàng)目文檔應(yīng)利用應(yīng)用程序的菜單資源 ID_FILE_NEW,因?yàn)檫@個(gè)資源 ID 已經(jīng)存在,而且其工具按鈕已建好。注意

22、原來 ID_FILE_NEW的消息響應(yīng)函數(shù)ON_COMMAND(ID_FILE_NECW,inApp:OnFileNew) 建在 CWinApp類中,應(yīng)該將其取消,而重新建在 CTypeObjGridView 類中。每新加一個(gè)新的 OLE項(xiàng)目文檔涉及在表格控件中添加一行和 OLE項(xiàng)目的對(duì)象選擇問題, 一個(gè)新的 OLE項(xiàng)目又牽涉在那一個(gè)視圖中激活問題。 這個(gè)功能的實(shí)現(xiàn), 需要大家認(rèn)真從程序代碼的調(diào)試中確定最好的方法,這里也給出一段參考代碼:void CTypeObjGridView:OnFileNew()if(m_szCurent_TypeCode.IsEmpty()AfxMessageBox(

23、 沒有文檔管理類型!);return;int nRows=m_OleObjGrid.GetRows();int nCols=m_OleObjGrid.GetCols();int nRow=0;/ 自動(dòng)確定文檔編號(hào)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(nRo

24、ws-1)*nCols+1,Code);.專業(yè) .專注 ./ 取日期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 代碼調(diào)試步驟與注釋3.1 應(yīng)用程序界面與OLE項(xiàng)目服

25、務(wù)程序界面共生只要 OLE對(duì)象激活, OLE項(xiàng)目的服務(wù)程序就融入到應(yīng)用程序中,而且他們的菜單和工具條共生于應(yīng)用程序界面中。BEGIN_INTERFACE_MAP(CMydocCntrItem,COleClientItem)INTERFACE_PART(CMydocCntrItem,IID_IOleDocumentSite,OleDocumentSite)END_INTERFACE_MAP()STDMETHODIMP_(ULONG) CMydocCntrItem:XOleDocumentSite:AddRef()METHOD_PROLOGUE_EX(CMydocCntrItem,OleDocum

26、entSite).專業(yè) .專注 .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 (CMydoc

27、CntrItem,OleDocumentSite)return pThis-ExternalQueryInterface(&iid,ppvObj);STDMETHODIMPCMydocCntrItem:XOleDocumentSite:ActivateMe(LPOLEDOCUMENTVIEWpDocView)IOleInPlaceSite* pIOleInPlaceSite;METHOD_PROLOGUE_EX(CMydocCntrItem,OleDocumentSite);pThis-InternalQueryInterface(&IID_IOleInPlaceSite,(void*)&pI

28、OleInPlaceSite);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;.專業(yè) .專注 .pThis-m_pDoc-Release();elsepDocView-AddRef();pThis-m_pWordView=pDocView;RE

29、CT rect;pDocView-UIActivate(TRUE);pDocView-GetRect(&rect);pThis-GetActiveView()-GetClientRect(&rect);pDocView-SetRect(&rect);pDocView-Show(TRUE);return NOERROR;3.2文檔類型視圖CTypeTreeView 類設(shè)計(jì)建立 CTreeView 類,直接由 NewClass 類向?qū)В瑥?CTreeView 類派生一個(gè)新類 CTypeTreeView , 創(chuàng) 建 新 類 后 在 類 的 定 義 中 首 先 觀 察 這 個(gè) 宏DECLARE_DYN

30、CREATE(CTypeTreeView)是否 存 在 ? 其 次 在 實(shí) 現(xiàn) 文 件 中 觀 察 IMPLEMENT_DYNCREATE(CTypeTreeView, CTreeView)宏是否存在?,這兩個(gè)宏的作用是,在主框架的 OnCreateClient 函數(shù)中需要使用 RUNTIME_CLASS宏找出指定類名的類名指針,由類的靜態(tài)函數(shù) CreateObject 創(chuàng)建視圖對(duì)象,沒有上述兩個(gè)宏,靜態(tài)函數(shù) CreateObject 就不可能存在,也就不可能由 OnCreateClient 函數(shù)創(chuàng)建指定視圖類名的對(duì)象 ; 再一個(gè)在 CTypeTreeView 類的定義中是否包含了DECLAR

31、E_MESSAGE_MAP()這個(gè)宏,它是建立消息映射的關(guān)鍵宏,與實(shí)現(xiàn)文件中的這一段宏是配套的,缺一不可。BEGIN_MESSAGE_MAP(CTypeTreeView, CTreeView)/AFX_MSG_MAP(CTyepTreeView)ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged).專業(yè) .專注 ./AFX_MSG_MAPEND_MESSAGE_MAP()由于 CTypeTreeView 類從 CTreeView 派生的, CTreeView 類的定義包含于 Afxcview.h 中,因此在 CTypeTreeView類的定義文件中一定

32、要 include 。為了使用CTypeTreeView 類 中 樹 型 控 件 的 風(fēng) 格 與 要 求 的 一 致 , 需 要 重 載PreCreateWindow(CREATESTRUCT& cs)這個(gè)虛函數(shù),來改變樹型控件的風(fēng)格。BOOL CTypeTreeView:PreCreateWindow(CREATESTRUCT& cs)cs.style|=TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_TRACKSELEC T|TVS_HASBUTTONS;return CTreeView:PreCreateWindow(cs);為加入應(yīng)

33、用程序的文檔類型條目,需要重載OnInitialUpdate()函數(shù),這個(gè)函數(shù)的作用從其函數(shù)名就可以知道,初始化更新,即 CTypeTreeView類的窗口建立后自動(dòng)調(diào)用的函數(shù)。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(02Ex

34、cel文檔 ,0,0,hParent);Ctrl.Expand(hParent,TVE_EXPAND);hParent=Ctrl.InsertItem(02技術(shù)文檔類 ,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

35、.InsertItem(02Excel文檔 ,0,0,hParent);Ctrl.Expand(hParent,TVE_EXPAND);這樣構(gòu)建出的類簡潔了很多,而且窗口位置、 大小根本不用考慮。 他會(huì)隨父.專業(yè) .專注 .窗口的變化而變化。 雖然應(yīng)用程序管理的文檔類型條目加入了樹型控件,但是還必須捕獲到用戶對(duì)條目的點(diǎn)擊情況產(chǎn)生需要的文檔類型編碼(4 數(shù)字字符)。實(shí)現(xiàn)的方法是捕獲CTypeTreeView 類的 TVN_SELCHANGED消息,即當(dāng)用戶改變了樹型控件中的條目, 則由系統(tǒng)發(fā)出這個(gè)消息, 捕獲到個(gè)這消息調(diào)用其對(duì)應(yīng)的消息響應(yīng)函數(shù)。void CTypeTreeView:OnSelch

36、anged(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)

37、ls=Ctrl.GetItemText(hParent);TypeCode=ls.Left(2);ls=Ctrl.GetItemText(hNewTree);TypeCode+=ls.Left(2);AfxMessageBox(TypeCode);/暫時(shí)給出消息框,看到產(chǎn)生的文檔類型碼*pResult = 0;3.3數(shù)據(jù)表視圖 CTypeObjGridView 類設(shè)計(jì)CMSFlexGrid 控件的編程方法。應(yīng)注意從對(duì)話框資源模板導(dǎo)出視圖類時(shí),基類不能選 CDialog 類,而選 CFormView類。當(dāng) CTypeObjGridView 類生成以后,在主框架類的 OnCreateClient

38、函數(shù)中找到 CTypeObjGridView 類名應(yīng)放的位置,以及應(yīng)包含的頭文件。需 要 為 此 類 的CMSFlexGrid成 員 引 入 列 名 , 這 個(gè) 工 作 是 重 載CTypeObjGridView 類的 OnInitialUpdate()函數(shù)。.專業(yè) .專注 .void CTypeObjGridView:OnInitialUpdate()CFormView:OnInitialUpdate();CString szItem5=序號(hào) , 文檔編號(hào) , 文檔摘要 , 文檔錄入日期, 文檔數(shù)據(jù)量 ;int Wides5=500,900,7500,1200,1200;m_OleObjGr

39、id.SetRows(11);m_OleObjGrid.SetCols(5);for(int i=0;icx,lpwndpos-cy);當(dāng)樹型控件( CTypeTreeView類對(duì)象)的選項(xiàng)發(fā)生改變后,把由父項(xiàng)與子項(xiàng)條目決定的文檔類型碼發(fā)送給數(shù)據(jù)表視圖(CTypeObjGridView 類對(duì)象),或直接傳給數(shù)據(jù)表視圖, 采用什么辦法因人而異, 其實(shí)應(yīng)用程序文檔對(duì)象是知道應(yīng)用程.專業(yè) .專注 .序客戶區(qū)所建的這三個(gè)視圖對(duì)象的,因?yàn)橹骺蚣艿腛nCreateClient函數(shù)在創(chuàng)建三個(gè)視圖時(shí),已經(jīng)將文檔對(duì)象傳給了三個(gè)視圖對(duì)象,所以應(yīng)該使用應(yīng)用程序的文檔對(duì)象作為數(shù)據(jù)傳遞的中轉(zhuǎn)站,通過文檔找到數(shù)據(jù)到達(dá)的目

40、標(biāo)視圖對(duì)象,然后實(shí)施數(shù)據(jù)傳遞。例如,在文檔類中添加一個(gè)查找目標(biāo)視圖對(duì)象的函數(shù),只給出目標(biāo)視圖的類名指針,找出存在的目標(biāo)視圖對(duì)象。CView* COleDDoc:FindTargetView(CRuntimeClass *pClass)POSITION pos=GetFirstViewPosition();while(pos)CView* pView=GetNextView(pos);if(pView-IsKindOf(pClass)return pView;return NULL;這樣可以把函數(shù)void CTypeTreeView:OnSelchanged的代碼修改為:void CTypeTr

41、eeView: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(hNewTre

42、e);if(hParent)ls=Ctrl.GetItemText(hParent);TypeCode=ls.Left(2);ls=Ctrl.GetItemText(hNewTree);TypeCode+=ls.Left(2);COleDDoc* pDoc=(COleDDoc*)GetDocument();.專業(yè) .專注 .CTypeObjGridView*pTargetView=(CTypeObjGridView*)pDoc-FindTargetView(RUNTIME_CLASS(CTypeObjGridView);if(pTargetView)pTargetView-LoadOleObj

43、FromTab(TypeCode);/根據(jù)類型碼從數(shù)據(jù)表讀出數(shù)據(jù)行*pResult = 0;當(dāng)樹型控件的選項(xiàng)發(fā)生改變, 獲得新的類型碼后直接調(diào)用 CTypeObjGridView 類的 LoadOleObjFromTab(TypeCode)函數(shù),把數(shù)據(jù)表中的相關(guān)數(shù)據(jù)行顯示于表格控件中。3.4引入 CCyzAdo類訪問數(shù)據(jù)庫使用 Ado 技術(shù)訪問數(shù)據(jù)庫, CCyzAdo類是教學(xué)時(shí)老師介紹給我們的集成了使用 Ado 技術(shù)訪問數(shù)據(jù)庫的基本方法, 我們也可以在這個(gè)基礎(chǔ)上進(jìn)行修改。 桌面數(shù)據(jù)庫 Access 相對(duì) SQL_Server 數(shù)據(jù)庫操控簡單一些, 它另一個(gè)優(yōu)勢是不需要數(shù)據(jù)庫環(huán)境就可訪問。針對(duì)本

44、課題,我們建立一個(gè) DocManager.mdb數(shù)據(jù)庫,其中僅設(shè)置一ObjData 數(shù)據(jù)表,此表的數(shù)據(jù)字段設(shè)置見表 5.1 。由數(shù)據(jù)表的字段可以看出,文檔數(shù)據(jù)是一個(gè)大二進(jìn)數(shù)據(jù)段,在 CCyzAdo類中已有大二進(jìn)數(shù)據(jù)出入數(shù)據(jù)表的方法。表 5.1 ObjData表字段屬性序號(hào)字段名稱數(shù)據(jù)類型數(shù)據(jù)長度1類型編碼文本42文檔編號(hào)文本43文檔摘要文本2554文檔錄入日期日期/時(shí)間85文檔數(shù)據(jù)量數(shù)字/ 單精8度6文檔數(shù)據(jù)OLE對(duì)象應(yīng)用程序所訪問的數(shù)據(jù)庫名必須寫入注冊(cè)表中,當(dāng)應(yīng)用程序運(yùn)行時(shí)從注冊(cè)表中提取,不需要每次運(yùn)行讓用戶去設(shè)置,下面一段參考代碼來實(shí)現(xiàn)這個(gè)目的,我.專業(yè) .專注 .們應(yīng)該把這個(gè)代碼放到程序

45、初始化的位置,即BOOLCOleDApp:InitInstance()函數(shù)中。SetRegistryKey(_T(OleDoc);mdb_File_Name=GetProfileString(Settings, 數(shù)據(jù)庫 , 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數(shù)據(jù)庫 (*.mdb)|*.mdb|); if(Dfile.DoMod

溫馨提示

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