我使用 WTL 创建了一个对话框,继承自 CDialogImpl 类,在主对话框中我创建了另一个对话框,在第二个子对话框中创建了一个列表控件。我想向列表控件添加拖放功能,我在网上阅读了有关 WM_DROPFILES 方法和 Ole Drop Target 的信息,我选择了后者。我已经按照 这个实现了 IDropTarget 接口方法。我已在所有对话中将接受文件选项设置为 TRUE,我已在子对话类中实例化 IDropTarget 并在其 WM_INITDIALOGUE 处理程序中调用以下方法:
//drag& drop
lpDropTarget = (LPDROPTARGET)new TDropTarget(m_hWnd);
CoLockObjectExternal(lpDropTarget, true, true);
// register the HWND as a drop target
RegisterDragDrop(m_hWnd, lpDropTarget);
lpDropTarget 实例化如下:
LPDROPTARGET lpDropTarget;
就是这样。之前没有真正使用过 Ole,所以我尝试了以下场景来寻找运气:
我已经为 List 控件 HWND 注册了 RegisterDragDrop,并将它的父对话框设置为接收
WM_OLEDROP WM_USER + 1
我发送的通知。好的,拖放光标显示,但没有调用 IDataTarget 函数的实现。RegisterDragDrop 也用于儿童对话和通知。
RegisterDragDrop 用于主对话框和它的通知。
在后来的情况下(2和3),拖放光标甚至没有出现,它向我展示了不允许拖放的光标。现在,所有对话框和列表控件都已设置为接受来自 Visual Studio 设计器的文件。我仅限于使用 ATL /WTL/WINAPI,没有 MFC。我究竟做错了什么?