Posted on 2008-09-18 12:20
没画完的画 阅读(952)
评论(0) 编辑 收藏 引用 所属分类:
Windows COM
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容器, 别问我, 我还没搞懂!!!