我已经通过派生COleDataSource和COleDropTarget实现了我的自定义拖放功能。 Everythings工作正常,但我有一个使应用程序崩溃的场景。
当用户处于拖放操作的中间时,当放置拖放控件的对话框被销毁时会发生这种情况。 这通常不常见,因为通常关闭对话框,用户必须使用鼠标或键盘,然后自动取消拖放操作。但在这种情况下,由于外部条件(更改视图的自定义消息)可以关闭对话框,然后不会取消drap& drop操作。
所以我的问题是,如何以编程方式取消拖放操作? 该操作从调用COleDataSource :: DoDragDrop的OnLButtonDown消息句柄开始。
更新
我已经使用DelayRender实现了它并继续崩溃。这是我得到的两个断言:
alt text http://www.freeimagehosting.net/uploads/b34a62c5ac.jpg
断言在Revoke方法中,这就是行:
ASSERT(m_lpDataObject == NULL);
alt text http://www.freeimagehosting.net/uploads/a0e8298490.jpg
在这种情况下,断言是在销毁COleDataSource(事实上它在其父类CCmdTarget中)。在这一行:
ASSERT(m_dwRef <= 1);
提前致谢!
答案 0 :(得分:1)
我不确定这是否可行,但您可以尝试覆盖COleDropTarget实例的QueryContinueDrag方法,并在对话框关闭的情况下返回DRAGDROP_S_CANCEL
答案 1 :(得分:1)
我注意到从Windows Vista开始的这种类型的崩溃。确保在堆上创建了COleDataSource!
CYourDataSource * pSource = new CYourDataSource; pSource-&GT;的DoDragDrop(); pSource-&GT; InternalRelease();