您的位置:首页 > 移动开发 > Objective-C

[COM] 基于OLE的可视化拖放操作: drag & drop、IDropSource、IDataObject、IDropTarget

2017-05-05 14:28 597 查看
应用场景
适用于文件(图片、视频、文件夹等)或文本(选中一段文字)在不同窗口之间的拖放,包括同一个进程的不同窗口之间、不同进程的窗口之间。
如图,演示了分别将桌面的bmp图片、txt文件、一段文本,向应用程序窗口上拖动的UI效果(demo中实现的窗口只支持接受图片文件)



介绍三个纯虚组件:IDropSource、IDataObject、IDropTarget
IDropSource
表示拖放操作的源,它包含了拖放目标要使用的数据(IDataObject),它能在拖放的过程生成一些可视化的反馈,如设置鼠标样式等
IDataObject
表示拖放操作的数据内容,实现源与目标之间的数据传输,遵循一定的格式描述。
IDropTarget
表示拖放操作的目标,它决定拖放的效果、接收任何合法数据、给拖放源一些反馈等。

应用程序不需要开发上面所有的接口,根据不同的场景实现对应的组件即可。
如果你的程序是作为拖放目标
实现IDropTarget接口就可以了。注意需要对目标窗口调用API进行注册,并在窗口释放时调用API取消注册。函数如下:
WINOLEAPI RegisterDragDrop(IN HWND hwnd, IN LPDROPTARGET pDropTarget);
WINOLEAPI RevokeDragDrop(IN HWND hwnd);

如果你的程序是作为拖动源
那么就实现IDropSource和IDataObject接口。调用如下API开始拖动操作(整个拖动过程中这个API会同步阻塞,直到拖动结束)
WINOLEAPI DoDragDrop(IN LPDATAOBJECT pDataObj,IN LPDROPSOURCE pDropSource,IN DWORD dwOKEffects,OUT LPDWORD pdwEffect);

注意
1、程序运行开始和结束时,需要调用COM和OLE的初始化、反初始化函数。
2、这几个函数的调用粒度均是线程级别(不是进程级!),即每个线程如果需要使用COM的话,需要单独调用初始化和反初始化。
CoInitialize(NULL);
OleInitialize(NULL);
// run your application
OleUninitialize();
CoUninitialize();


三个组件的开发流程,可参考这几篇博客:
http://blog.csdn.net/leehong2005/article/category/1349085
http://blog.csdn.net/liu4584945/article/details/6205341
http://www.cppblog.com/windcsn/archive/2006/03/01/3598.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息