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