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

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

下面是修改之后的版本:

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

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

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

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

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

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

总结

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

最后

声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!

(0)
上一篇 2022年1月9日
下一篇 2022年1月9日

相关推荐