COleDataSource / COleDropTarget取消拖放操作

时间:2009-11-05 16:11:42

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

我已经通过派生COleDataSource和COleDropTarget实现了我的自定义拖放功能。 Everythings工作正常,但我有一个使应用程序崩溃的场景。

当用户处于拖放操作的中间时,当放置拖放控件的对话框被销毁时会发生这种情况。 这通常不常见,因为通常关闭对话框,用户必须使用鼠标或键盘,然后自动取消拖放操作。但在这种情况下,由于外部条件(更改视图的自定义消息)可以关闭对话框,然后不会取消drap& drop操作。

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

更新

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

  1. 当鼠标指针(拖动时)位于COleDropTarget派生类的控件内。
  2. alt text http://www.freeimagehosting.net/uploads/b34a62c5ac.jpg

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

    ASSERT(m_lpDataObject == NULL);
    
    1. 当鼠标指针不在COleDropTarget派生类中时。
    2. alt text http://www.freeimagehosting.net/uploads/a0e8298490.jpg

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

      ASSERT(m_dwRef <= 1);
      

      提前致谢!

2 个答案:

答案 0 :(得分:1)

我不确定这是否可行,但您可以尝试覆盖COleDropTarget实例的QueryContinueDrag方法,并在对话框关闭的情况下返回DRAGDROP_S_CANCEL

答案 1 :(得分:1)

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

CYourDataSource * pSource = new CYourDataSource; pSource-&GT;的DoDragDrop(); pSource-&GT; InternalRelease();