Posted on 2008-09-18 12:20
沒畫完的畫 閱讀(982)
評論(0) 編輯 收藏 引用 所屬分類:
Windows COM
OLE 2 高級編程技術(shù) 主要還是講了OLE內(nèi)部的實現(xiàn)機制,
看了半天,還沒看到相關(guān)創(chuàng)建容器的相關(guān)內(nèi)容,看的過程中幾度我曾想昏睡過去……
數(shù)據(jù)對象 IDataObject
傳遞協(xié)議是一種將 IDataObject 指針從數(shù)據(jù)的源傳送到數(shù)據(jù)的用戶那兒的一種機制
任何可被認(rèn)作是數(shù)據(jù)源的部份都可以通過一個它可以其上實現(xiàn) IDataObject 接口的數(shù)據(jù)對象來描述它的數(shù)據(jù)
視圖對象和 IViewObject 接口
視圖對象類似于數(shù)據(jù)對象,因為它總是另外處理一些其它更復(fù)雜的對象的方法
視圖對象就是用戶可以通過一個 IViewObject 接口指針來使用任何對象,這種安排可使讀者能要求對象繪制出其自身或有關(guān)其圖象表示形式的管理細節(jié)。
接口的存在可使一個對象用戶要求對象直接呈現(xiàn)到設(shè)備上而不是呈送到傳送媒介上
詢問對象,“你能否在我提供的HDC畫出你自己?”就相當(dāng)于以 IID_IViewObject 調(diào)用 QueryInterface().
如果對象不能做到或?qū)ο笤贓XE中,則回答,“不能”
·如果需要改變映象模式或任何其它有關(guān) hdc 的畫面,要確保在進入 IViewObject::Draw 時使用 SaveDC 而在 退出時使用 RestoreDC()
IViewObject::Draw() 的三個參數(shù)分別為一個畫面(dwAspect),一個片段索引(lindex),以及一個指向目標(biāo)設(shè)備結(jié)構(gòu)的指針(ptd)
·不能將 IViewObject 指針從一個進程傳送到另一進程, 因為 HDC 只有在同一進程的 context 中才有意義
pIViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, 0, hDC, &rc, NULL, NULL, 0);
這行代碼的意義是“在該DC上的一個矩形上繪制對象(DVASPECT_CONTENT, -1)”
dwAspect(DWORD):
DVASPECT_CONTENT
DVASPECT_THUMBNAIL
DVASPECT_ICON
DVASPECT_DOCPRINT
lindex(LONG) : 數(shù)據(jù)片斷的索引,在OLE2 中, 它總是為 -1
OLE2 提供API OleDraw() 它實際上調(diào)用了 IViewObject::Draw()...
通過 AdviseSink 數(shù)據(jù)對象的用戶可在數(shù)據(jù)對象中的特定數(shù)據(jù)格式發(fā)生變化時接收到 通知
咨詢連接的建立可以有很多選擇,如對象是否必須以通知發(fā)送數(shù)據(jù)。。
OLE2UI 庫.....(現(xiàn)在才知道原來有這個東西)
pick - drag - drop 與 Cut/copy - Paste 的區(qū)別是,拖放操作直接而且立即完成
通過將一個窗口句柄及一個指向 IDropTarget 接口的指針傳遞給 RegisterDragDrop 一個用戶將自己注冊為一個 放目標(biāo)
一個源通過將其 IDataObject 及 IDropSource 傳遞給 DoDragDrop 來啟動拖放操作
執(zhí)行 DoDragDrop 來完成整個拖放操作
一個循序漸近的拖放實現(xiàn): Cosmo
IDropTarget::DragOver()
IDropTarget::DragLeave()
IDropSource
OLE2的拖放機制是剪貼板操作的一個流線(streamlining)
被動態(tài),還未裝到內(nèi)存
裝載態(tài),在磁盤中裝入內(nèi)存
運行態(tài),已經(jīng)裝到內(nèi)存中運行
DoVerb 在被以 OLEIVERB_SHOW 調(diào)用時,將對象從隱含的運行態(tài)移至可以的運行態(tài),而在被以 OLEIVERB_HIDE 調(diào)用時,將對象從可見運行態(tài)移至隱含運行態(tài),IOleObject::Close 則將任何對象從運行態(tài)移至裝載態(tài)
OleCreate 創(chuàng)建一個新的對象,對象即刻處于裝載態(tài), 在調(diào)用 OleCreate 后一般會很快調(diào)用 DoVerb 使對象處于運行態(tài)
容器總是有 IOleObject, IDataObject, IPersistStorage, IViewObject, 和 IOleCache 接口
IOleClientSite(現(xiàn)場),對象在容器中的位置的相關(guān)描述
IAdviseSink::OnViewChange() 用來接收 ViewChange 的相關(guān)相變的通知
重畫時,將會生成一個對 IViewObject::Draw 的調(diào)用(通過 OleDraw)
實現(xiàn)給OLE對象加上陰影,OleUIDrawShading()
OleUIInsertObject() 顯示 InsertObject 對話框
后記:
什么是OLE, 如何實現(xiàn)自己的OLE容器, 別問我, 我還沒搞懂!!!