将文件拖到窗口中时设置光标

SetCursor while dragging files into a window

本文关键字:置光标 窗口 文件      更新时间:2023-10-16

我使用Windows API创建一个仅具有窗口的应用程序,因此此窗口中的所有内容都是使用Direct2D绘制的。

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

我希望鼠标光标根据鼠标所在的窗口区域而有所不同。在不处理下降的区域,我希望光标是无效图标,对于我处理下降的窗口区域,我希望正确的放置图标。

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

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

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

您需要

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

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

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

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

有关更多详细信息,请参阅 MSDN

OLE 和数据传输

使用拖放和剪贴板传输外壳对象