外壳对象拖放第一部分:获取IDataObject接口

外壳对象拖放第一部分:获取IDataObject接口

作者:BlogUpdater |  时间:2022-01-13 |  浏览:269 |  评论已关闭 条评论

外壳(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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。