外壳对象拖放第一部分:获取IDataObject接口
外壳(Shell)会给你一个IDataObject接口,你所需要做的,就是将它”拖来拖去”。
顺便说一下,今天这篇文章是外壳对象拖放系列文章的第一篇,请各位猿友坐稳,扶好,要发车了。
我们还是回到之前的基础例子程序中,然后我们添加之前文章中讲到的GetUIObjectOfFile函数。另外,我们将CoInitialize/CoUninitialize调用修改为OleInitialize/OleUninitialize,为什么要改?因为我们即将从COM的世界进入到全新的OLE世界,行头肯定得换一下。
为了初始化拖放操作,我们需要添加一个放置源(Drop Source),如下图所示:


正如你所看到的,这个DropSource对象的实现确实很无聊,甚至那些比较有意思的方法也没啥好说的。
方法IDropSource::QueryContinueDrag更加像一个模板代码。如果ESC按键按下了,则拖放操作会取消。如果鼠标按键被释放,则完成拖放操作。否则,继续执行当前的操作。
方法IDropSource::GiveFeedback就更加无聊了。它仅仅是返回一个DRAGDROP_S_USEDEFAULTCURSORS,来指示它希望得到默认的反馈。
信不信由你,至此,我们已经完成了拖动一个文件所需要的全部工作,如下图所示:

为了拖动一个对象,你需要做两件事情:一个数据对象(Data Object)和一个放置源(Drop Source)。我们在上面的代码中创建了DropSource,然后数据对象可以请求Shell得到。接下来唯一需要做的,就是调用DoDragDrop方法开始拖放流程了。
请注意,我们在DoDragDrop调用中指定了DROPEFFECT_COPY和DROPEFFECT_LINK这两个标志。同时,我们没有添加DROPEFFECT_MOVE这个标志,因为这个例子程序并不是一个完整的外壳程序,所以它不支持文件的移动操作,毕竟用户也没有预期到这个操作会导致文件的移动。
总结
看起来,不是很复杂,对吧? 但是,因为我一直觉得拖放操作是一个比较复杂的东西,所以在拓扑梅尔智慧办公平台(Topomel Box)中还未添加相关支持,后面有时间希望可以完善完善。
伟大的软件产品应该是自然的,拖放的操作非常符合用户的操作习惯,一般经验的玩家都会明白并熟练使用拖放操作,所以,在你的产品中,如果能添加这些看起来比较自然的操作支持,用户就会喜欢使用。
接下来,我们会添加对象移动的支持,以及其工作原理。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Dragging a shell object, part 1: Getting the IDataObject》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

- 下一篇: 外壳对象拖放第二部分:支持移动操作
- 上一篇: 为什么多个文件打印时顺序是随机的?
相关推荐
- 为什么不能在气泡提示中防止超链接
- Posted on 12月20日
- 我们来看看窗口句柄的底层实现
- Posted on 03月21日
- 名词解释:Adjustor thunks
- Posted on 11月29日
- 不要被各种专业术语吓倒
- Posted on 11月29日



评论已关闭。