2009-11-05 30 views
2

我已經通過派生自COleDataSource和COleDropTarget實現了我的自定義拖動&刪除。 Everythings工作正常,但我有一個場景,使應用程序崩潰。COleDataSource/COleDropTarget取消拖放操作

當拖放控件放置的對話框被放置時,會發生這種情況,而用戶處於拖動操作的中間時會被銷燬。 這是不正常的,因爲通常要關閉一個對話框,用戶必須使用鼠標或鍵盤,然後拖動操作被自動取消。但是在這種情況下,由於外部條件(改變視圖的自定義消息),可以關閉對話框,然後拖放操作不會被取消。

所以我的問題是,我怎樣才能以編程方式取消拖動操作&? 該操作從調用COleDataSource :: DoDragDrop的OnLButtonDown消息句柄開始。

更新:

我使用DelayRender實施並繼續崩潰。這是兩個斷言我得到:

  1. 當鼠標指針(拖動)是是一種COleDropTarget派生的類的控制的內部。

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

斷言是在撤消方法,這是行:

ASSERT(m_lpDataObject == NULL); 
  • 當鼠標指針是不是一個內部COleDropTarget-派生類。
  • alt text http://www.freeimagehosting.net/uploads/a0e8298490.jpg

    在此情況下斷言是在COleDataSource的破壞(實際上它是在它的父類CCmdTarget的)。在這一行:

    ASSERT(m_dwRef <= 1); 
    

    在此先感謝!

    +0

    你要拖動什麼樣的數據?你在使用COleDataSource :: DelayRenderData()和COleDataSource :: OnRenderData()嗎? – 2009-11-05 20:29:55

    +0

    不,我不是。我正在使用CacheGlobalData和GetGlobalData。你能舉一個關於DelayRenderData如何工作的例子嗎? – 2009-11-06 07:36:32

    回答

    1

    我不知道這是否會工作,但你可以嘗試重寫COleDropTarget實例的QueryContinueDrag方法,並在該對話框關閉

    +0

    我已經試過了,它沒有工作。QueryContinueDrag僅在鍵盤或鼠標狀態發生變化時才被調用,並且在OnDestroy(在拖放控件中)和實際銷燬之後不可以調用,因此我無法弄清楚如何使用它。 – 2009-11-07 16:40:54

    +0

    最後,我使用了QueryContinueDrag來解決我的問題。開始時的問題是,一旦控制器被破壞,我試圖取消拖動操作。解決方案是不要摧毀控制,直到拖動操作取消...我設置了一個計時器,並等到取消之前,試圖摧毀它。 – 2009-12-10 10:42:01

    1

    的情況下返回DRAGDROP_S_CANCEL我發現這種類型的崩潰開始與Windows Vista系統。確保COleDataSource在堆上創建!

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