[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取消注册。函数如下:
如果你的程序是作为拖动源
那么就实现IDropSource和IDataObject接口。调用如下API开始拖动操作(整个拖动过程中这个API会同步阻塞,直到拖动结束)
注意
1、程序运行开始和结束时,需要调用COM和OLE的初始化、反初始化函数。
2、这几个函数的调用粒度均是线程级别(不是进程级!),即每个线程如果需要使用COM的话,需要单独调用初始化和反初始化。
三个组件的开发流程,可参考这几篇博客:
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
适用于文件(图片、视频、文件夹等)或文本(选中一段文字)在不同窗口之间的拖放,包括同一个进程的不同窗口之间、不同进程的窗口之间。
如图,演示了分别将桌面的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
相关文章推荐
- SWT 的拖放操作,DragSource 和 DropTarget 与剪切板(Clipboard)
- 第三部分:实现IDataObject(OLE drag&drop之旅)
- 第三部分:实现IDataObject(OLE drag&drop之旅)
- Silverlight & Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
- Window下拖放操作Drag & Drop 全解析
- Window下拖放操作Drag & Drop 全解析 (整理)
- Silverlight & Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
- Silverlight & Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
- Silverlight & Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
- (ZT) Window下拖放操作Drag & Drop 全解析
- Window下拖放操作Drag & Drop 全解析
- OLE拖放-drag-drop-5
- Internet Explorer 编程简述(十一)实现完美的Inplace Drag & Drop——“超级拖放”
- Internet Explorer 编程简述(十一)实现完美的Inplace Drag & Drop——“超级拖放”
- Drag and Drop(OLE)-OLE的拖放功能
- 第六部分:实现Drop目标对象(OLE drag&drop 之旅)
- Drag and Drop(OLE)-OLE的拖放功能
- OLE拖放-drag-drop-4
- Control study -> Drag拖放数据操作示例
- OLE拖放-drag-drop-6