c++ - COleDataSource/COleDropTarget 取消拖放操作

标签 c++ visual-c++ mfc drag-and-drop

我通过派生自 COleDataSource 和 COleDropTarget 实现了我的自定义拖放。一切正常,但我有一个场景导致应用程序崩溃。

如果放置拖放控件的对话框在用户正在进行拖放操作的过程中被销毁,就会发生这种情况。 这并不常见,因为通常要关闭对话框,用户必须使用鼠标或键盘,然后拖放操作会自动取消。但在这种情况下,对话框可能会因外部条件(更改 View 的自定义消息)而关闭,然后拖放操作不会被取消。

所以我的问题是,如何以编程方式取消拖放操作? 该操作从调用 COleDataSource::DoDragDrop 的 OnLButtonDown 消息句柄开始。

更新:

我已经使用 DelayRender 实现,但它继续崩溃。这是我得到的两个断言:

  1. 当鼠标指针(拖动时)位于一个控件内,该控件是 COleDropTarget 的派生类。

alt text http://www.freeimagehosting.net/uploads/b34a62c5ac.jpg

断言在 Revoke 方法中,这是一行:

ASSERT(m_lpDataObject == NULL);
  1. 当鼠标指针不在 COleDropTarget 派生类中时。

alt text http://www.freeimagehosting.net/uploads/a0e8298490.jpg

在这种情况下,断言是在 COleDataSource 的销毁中(实际上它是在其父类 CCmdTarget 中)。在这一行中:

ASSERT(m_dwRef <= 1);

提前致谢!

最佳答案

我注意到这种类型的崩溃从 Windows Vista 开始。确保在堆上创建 COleDataSource!

CYourDataSource *pSource = new CYourDataSource; pSource->DoDragDrop(); pSource->InternalRelease();

关于c++ - COleDataSource/COleDropTarget 取消拖放操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1681637/

相关文章:

c++ - 如何从库函数访问 C++ 中的 argc 和 argv

c++ - IDC_PICTURE 坐标上的 OnMouseMove

winapi - WM_COMMAND WM_NOTIFY 自定义通知代码

visual-c++ - 第一个条件中的变量赋值和第二个条件中使用相同的变量 定义良好吗?

c++ - 向 VS C++ 控制台程序添加视觉效果

c++ - 如何在 CDateTimeCtrl 中居中对齐文本?

c++ - 寻求改进的C++程序+问题

java - c++ 中有效的 java builder 习语等价物?

python - 用python重写部分c/c++程序

C++ 构造函数成员初始化列表,对象切片