gpt4 book ai didi

c++ - 将文件拖动到窗口中时设置光标

转载 作者:行者123 更新时间:2023-11-30 01:57:18 25 4
gpt4 key购买 nike

我正在使用 Windows API 创建一个只有一个窗口的应用程序,所以这个窗口内的所有内容都是使用 Direct2D 绘制的。

现在我想在窗口客户区的特定部分放置一些文件,我正在处理消息 WM_DROPFILES。没问题,当文件被放到那些特定区域时,我可以正确处理它们并且一切正常。顺便说一句,我的窗口是 DragAcceptFiles(hWnd, true),它总是接受拖放。

我希望鼠标光标根据鼠标所在窗口的区域而有所不同。在我不处理掉落的区域,我希望光标是无效图标,而对于我处理掉落的窗口,我想要正确的掉落图标。

我注意到的第一件事是,当文件被拖到窗口中时没有生成任何消息,因此我添加了一个鼠标钩子(Hook)(WH_MOUSE_LL 使用 SetWindowsHookEx ).处理 hook 时,我只查看 WM_MOUSEMOVE 消息,因此我可以根据鼠标所在的区域更改光标。

问题是 SetCursor 什么都不做,如果我的窗口被配置为接受拖动文件,光标总是拖/放光标,无论我调用多少次 SetCursor

以这种方式更改光标似乎是不可能的,但是有没有其他方法可以实现我想要实现的目标?

最佳答案

您需要在代码中编写一个类来实现 IDropTarget接口(interface),然后创建该类的实例并将其传递给 RegisterDragDrop()将它与您的窗口相关联。不要再使用 DragAcceptFiles()

每当用户在您的窗口上拖动任何东西(不仅仅是文件)时,您的 IDropTarget::DragEnter()IDropTarget::DragOver()IDropTarget::DragLeave() 方法将相应地被调用,为您提供拖动的当前坐标和有关被拖动数据的信息(因此您可以过滤掉任何您不想接受的数据)。如果您选择接受数据,并且用户实际将数据放到您的窗口上,您的 IDropTarget::Drop() 方法将被调用。

作为放置目标,更改光标不是您的责任。根据需要处理它是放置源的责任。在您的 IDropTarget::DragEnter()IDropTarget::DragOver() 实现中,您需要做的就是将 pdwEffect 输出参数设置为合适的DROPEFFECT值(value)。该值被传递回放置源,然后在其 IDropSource::GiveFeedback() 实现中向用户显示视觉反馈(如更改光标)。

您的 IDropTarget 可以在没有用户交互的情况下被调用(即,可以从其他应用程序编程,而不仅仅是用于拖放操作)。这就是放置源而不是放置目标决定是否向用户显示 UI 更新的原因,因为只有放置源知道它首先调用您的 IDropTarget 的原因。放置目标不知道(或关心)它为什么被调用,只知道它被提供了一些数据并询问它是接受还是拒绝该数据,仅此而已。

有关详细信息,请参阅 MSDN:

OLE and Data Transfer

Transferring Shell Objects with Drag-and-Drop and the Clipboard

关于c++ - 将文件拖动到窗口中时设置光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18856514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com