OLE拖放原理
MFC为实现对象拖放提供了如下类:COleDataSource、COleDataObject、COleDropTarget、COleDropSource。下面分别介绍它们,然后通过一个实例讲述实现的具体步骤。
· COleDataSource
启动一次拖放操作,保存拖放的数据,并向系统提供拖放对象的数据。类中重要的成员函数根据用途分为如下三种:
1. 用于设定提供数据的方式和使用的数据格式。
提供数据的方式有两种,一种是即时方式,另一种是延迟方式。延迟方式不需要立即提供数据,当需要提供数据时,系统将调用对应的函数来获得数据,一般都是重载OnRenderData函数或其他虚函数,以响应数据请求。数据格式可以是CF_TEXT等常用的剪贴板格式,也可以是自己利用函数RegisterClipboardFormat函数注册的特定格式。
CacheData:提供指定格式的数据,格式由结构STGMEDIUM指定,即时方式;
CacheGlobalData:利用全局句柄HGLOBAL,为指定格式提供数据,即时方式,适用小数据量;
DelayRenderData:使用延迟方式按指定格式提供数据,当系统需要数据时,会调用函数OnRenderGlobalData/OnRenderData来取得数据;
DelayRenderFileData:使用延迟方式利用CFile为指定格式提供数据,当需要数据时,会调用函数OnRenderFileData来取得数据;
2. 响应请求,提供数据
OnRenderFileData:为延迟方式提供CFile型数据。
OnRenderGlobalData:为延迟方式提供HGLOBAL数据。
OnRenerData:为延迟方式提供各种所支持的类型的数据。
3. 实施拖放操作
DoDragDrop:开始实施拖放操作
· COleDataObject
用于代表拖放的数据,它是作为COleDataSource类的成员,类中主要成员函数有:
BeginEnumFormat:为枚举数据格式作准备;
GetNextFormat:返回下一个数据格式;
IsDataAvailable: 检查指定的数据格式是否可用;
GetData:按指定数据格式,获得数据;
GetFileData:按指定数据格式,获得CFile型数据;
GetGlobalData:按指定数据格式,获得HGLOBAL型数据;
· COleDropTarget
用于在窗口和OLE库之间提供通讯机制。任何一个窗口,要想能够接收拖放,必须包含一个COleDropTarget对象,并注册之。其中的成员函数可分为两大类:
1. 注册
Register:注册该对象,以便使窗口能够接收拖放对象
2. 响应拖放过程中的动作(虚函数)
OnDragEnter:当鼠标首次进入窗口时被调用;
OnDragLeave:当鼠标移出窗口时被调用;
OnDragOver:当鼠标停留在窗口内时,被重复调用;
OnDrop: 当鼠标在窗口内落下被调用;
虚函数onDragEnter和OnDragOver的返回值具有重要的含义,一般为以下三种之一:
DROPEFFECT_MOVE:移动操作,允许对象落在此窗口,落下时要删除原来的对象;
DROPEFFECT_COPY:复制操作,允许对象落在此窗口,落下时不删除原来的对象;
DROPFFECT_NONE:不允许对象落在此窗口;
· COleDropSource
COleDropSource允许数据被拖放到一个拖放目标,它负责对何时启动一个拖放操作进行决断,反馈拖放操作状态,以及判断拖放操作何时结束。这个类比较简单,用得也较少。它的成员函数只有三个:
GiveFeedback:用于改变拖放期间鼠标的光标,把拖放状态反馈给用户知晓;
OnBeginDrag:在拖放期间捕捉鼠标指针,当应用程序框架觉得可能要发生一个拖放操作时,它会调用该函数;
QueryContinueDrag:检测拖放操作是否还在继续中。
Damo: