将文件拖到窗口中时设置光标
SetCursor while dragging files into a window
我使用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 和数据传输
使用拖放和剪贴板传输外壳对象
- 内置函数可查看CPP中的成员变量
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 避免在光标移到子窗口上时WM_MOUSELEAVE
- 如何在应用程序窗口中设置光标位置?(C )
- 防止触摸输入移动的鼠标光标在窗口上
- 在后台控制台窗口中显示光标
- SDL2切换全屏:窗口位置重置
- 如何使光标"True Transparent"窗口,最好是在纯QML上?(Qt 5.7)
- 当光标不在窗口小部件上时,QT小部件检测鼠标事件
- 获取光标下窗口的窗口句柄
- 应该如何检索当前活动窗口的光标下的单词
- SDL中的Alpha混合在调整窗口大小后重置
- 在SFML中超过窗口边界时,将光标发送到新行
- 将光标悬停在子窗口上时更改光标
- 如果检测到鼠标移动,请在 MFC C++对话框窗口中显示光标
- 如何在 c++ 中将光标移动到上次打开的窗口(可能是弹出窗口)
- 将文件拖到窗口中时设置光标
- Qt鼠标光标重置
- 如何确定鼠标是否指向光标下窗口的最大按钮
- 尝试将光标剪辑到我的窗口不起作用?