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