使用IDropTarget接口同时支持文本和文件拖放(二)

本文档介绍了如何利用IDropTarget接口在Windows中实现同时支持文本和文件的拖放操作,详细阐述了关键步骤和技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
使用IDropTarget接口同时支持文本和文件拖放(二)
2008-01-12 07:47

在这里我们最感兴趣的是

cfFormattymed两个数据。cfFormat是标准的“粘帖板”数据类型比如CF_TEXT之类。tymed表示数据所依附的媒介,比如内存,磁盘文件,存储对象等等。其他的成员可以参见MSDN

一个典型的

FORMATETC结构变量定义如下:

FORMATETC cFmt = {(CLIPFORMAT) CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};

IDataObject提供了一个GetData接口来获取其实例里包含的数据,比如:

STGMEDIUM stgMedium;

ret = pDataObject->GetData(&cFmt, &stgMedium);

GetData传入cFmt,以指出所感兴趣的数据,并将返回在stgMedium结构里。

STGMEDIUM

的定义如下1

typedef struct tagSTGMEDIUM

{

DWORD tymed;

[switch_type(DWORD), switch_is((DWORD) tymed)]

union {

[case(TYMED_GDI)] HBITMAP hBitmap;

[case(TYMED_MFPICT)] HMETAFILEPICT hMetaFilePict;

[case(TYMED_ENHMF)] HENHMETAFILE hEnhMetaFile;

[case(TYMED_HGLOBAL)] HGLOBAL hGlobal;

[case(TYMED_FILE)] LPWSTR lpszFileName;

[case(TYMED_ISTREAM)] IStream *pstm;

[case(TYMED_ISTORAGE)] IStorage *pstg;

[default] ;

};

[unique] IUnknown *pUnkForRelease;

}STGMEDIUM;

typedef STGMEDIUM *LPSTGMEDIUM;

看起来颇为复杂,其实主要是一系列句柄或数据对象接口的联合,根据数据具体的类型,使用其中之一即可。

tymedFORMATETC里一样,指出数据的载体类型(遗憾的是它不能指出具体的标准类型比如CF_TEXT或者其他)。至于pUnkForRelease,是源数据指定的一个接口,用来传递给ReleaseStgMedium函数,如果它不为NULL,则ReleaseStgMedium函数使用这个接口释放数据。如果为NULL,ReleaseStgMedium函数使用默认的IUnknown接口。对于常规的拖放来说,这个对象指针应该为NULL.

得到了句柄或数据对象接口,也相当于得到了拖放的数据。

定义一个特定的

FORMATETC结构实例传递给IDataObject的GetData,可以直接询问和获取某一种特定的数据。如果我们对我们想要的数据是非常确定的,这是比较有效率的方法。但是如果我们期望能够对拖放的对象进行自适应的话,我们可以采取枚举IDataObject里包含的所有数据类型的方案。这就要用到IEnumFORMATETC接口了。

IEnumFORMATETC接口从IDataObject接口里获取:

IEnumFormatETC *pEnumFmt = NULL;

ret = pDataObject->EnumFormatEtc (DATADIR_GET,&pEnumFmt);

如果获取成功,则可以通过

IEnumFORMATETC 接口的 Next 方法,来枚举所有的数据格式:

pEnumFmt->Reset ();

HRESULT Ret=S_OK

while(Ret!=S_OK)

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值