外壳对象拖放第二部分:支持移动操作

外壳对象拖放第二部分:支持移动操作

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

如我所承诺的。
今天我会讲讲如何在之前的代码的基础上,添加拖动时移动对象的支持。这一次,我们不再使用我们的老朋友”clock.avi”,而是新创建一些测试文件。让我们假设在C盘创建一个测试文件,且叫它throwaway.txt。然后,我们修改OnLButtonDown函数的代码,如下图所示:

哦等等,有朋友会认为我在提倡硬编码路径(把路径在程序中写死),那我们就将程序稍微修改一下:将路径传入到命令行,程序从命令行中获取目标路径。这个功能和本文所要讲解的主题没有太大的关系,这就是我一开始写死路径的原因。就我个人而言,我不喜欢一个和待讲解主题90%不相关的示例程序。因为如果那样的话,我必须深入挖掘代码寻找 10% 的重要内容。

下面是修改之后的版本:

Woo-hoo,八行令人分心的代码,与拖动外壳对象的主题无关,希望这一次你能够满意啊。

我们刚才讲到哪儿了? 哦,对了,解释第一批蓝色代码,由于中间的大部分和本文主题无关的代码,我们需要滚动屏幕显示需要关注的内容。

现在我们允许对象的移动,则我们需要检查生成的效果是否为 DROPEFFECT_MOVE,它告诉我们,”放置目标(Drop Target)想要执行移动操作,但它只复制了对象; 请删除源文件从而完成移动操作。”

请注意,DROPEFFECT_MOVE 并不意味着”放置目标(Drop Target)执行了移动操作”。 相反,它告诉你放置目标希望由你来删除源文件。如果放置目标能够删除源文件(或直接移动它),那么你将不会得到DROPEFFECT_MOVE的返回。

(DROPEFFECT_MOVE 甚至根本不意味着移动操作发生的一种情况是,如果用户将对象拖到”回收站”图标上,其目的是销毁掉到其上的任何东西。在这种情况下,回收站不复制文件就返回 DROPEFFECT_MOVE。结果:对象被删除。DROPEFFECT_MOVE的更好名称应该是 DROPEFFECT_DELETEORIGINAL。)

如果数据对象代表一个文件,那么外壳非常擅长弄清楚如何将文件移动到目标位置,而不是复制它并要求你来删除源文件。只有当数据对象代表一个非文件时,你通常才会返回 DROPEFFECT_MOVE,因为在这种情况下,外壳不知道如何删除源文件。
但是,如果你想知道,拖动操作是否为真正意义上的移动,而不管该操作是否被放置目标所优化? 我们下次再看。

(顺便说一句,如果你执行了一次文件的移动操作,不要忘记将其移回去,以便你可以再次运行我们的例子程序)

总结
通过本实例的讲解,大家应该明白如何处理文件对象的移动语义了吧?
“了然,了然。”

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Dragging a shell object, part 2: Enabling the Move operation》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。