对话框可以拦截拖放传递给其控件的邮件吗?

时间:2015-06-09 15:57:17

标签: winapi mfc drag-and-drop

如果对话框将其某些控件注册为放置目标,则拖放用于这些控件的消息将以对话框可以注册的方式通过对话框的消息处理要通知/拦截这些消息的消息处理程序?

与此问题类似,我希望在某些情况下,在调用个别删除处理程序之前,将事件拖放到更高级别。但那个问题的答案表明这不是真的可能吗? How to disable drag/drop when a dialog box is open

1 个答案:

答案 0 :(得分:2)

  

如果一个对话框将其某些控件注册为drop-targets,那么用于这些控件的drag'n'drop消息将通过对话框的消息处理,对话框可以注册一个消息处理程序以通知/拦截那些消息?

如果控件使用DragAcceptFiles()WM_DROPFILES消息将直接转到各个控件的窗口过程,而不是对话框的窗口过程。如果要拦截消息,则必须使用SetWindowLongPtr()SetWindowSubClass()对各个控件进行子类化,或使用SetWindowsHookEx()中的消息钩子。

如果控件正在使用RegisterDragDrop(),则拖放操作根本不会通过任何窗口过程,因为OLE拖放操作不会使用窗口消息。

  

以与此问题类似的方式,我想在某些情况下,在调用单个drop-handler之前,在更高级别捕获drag'n'drop事件。但那个问题的答案表明这不太可能吗?

这只能通过DragAcceptFiles()和子类化/挂钩来实现。