我通过派生自 COleDataSource 和 COleDropTarget 实现了我的自定义拖放。一切正常,但我有一个场景导致应用程序崩溃。
如果放置拖放控件的对话框在用户正在进行拖放操作的过程中被销毁,就会发生这种情况。 这并不常见,因为通常要关闭对话框,用户必须使用鼠标或键盘,然后拖放操作会自动取消。但在这种情况下,对话框可能会因外部条件(更改 View 的自定义消息)而关闭,然后拖放操作不会被取消。
所以我的问题是,如何以编程方式取消拖放操作? 该操作从调用 COleDataSource::DoDragDrop 的 OnLButtonDown 消息句柄开始。
更新:
我已经使用 DelayRender 实现,但它继续崩溃。这是我得到的两个断言:
- 当鼠标指针(拖动时)位于一个控件内,该控件是 COleDropTarget 的派生类。
alt text http://www.freeimagehosting.net/uploads/b34a62c5ac.jpg
断言在 Revoke 方法中,这是一行:
ASSERT(m_lpDataObject == NULL);
- 当鼠标指针不在 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/