最近在處理有關ole拖拽的問題(在windows上的win32/64程式,無MFC支持),關于拖拽進入程式的部分已經處理完成,關于拖拽出去的功能,普通的實作也沒有問題,但問題在于如何實作延遲拖拽的效果。
意思就是說當DoDragDrop這個方法已經完成,拖拽時按下的滑鼠已經松開了,但是作為被拖拽的物件還不存在時如何處理。打個比方,就是從程式里拖拽了一個檔案出去,但此時檔案并不存在,或者需要下載或者需要解壓,那么在檔案在本地處理好了以后,怎么再實作讓該檔案出現在當初的拖拽位置?
關于這個問題,我覺得有兩個思路:
一個是比較搓的,就是在拖拽完成的時候記錄當前滑鼠位置以及視窗,在本地檔案處理好了以后,再模擬把該檔案放到當時記錄的地方,但這樣一來無意是非常繁重的操作,對于桌面要記錄拖拽位置,對于檔案夾要記錄路徑,最重要的是如果是拖拽到其他支持拖拽的程式里壓根就沒有延遲實作的辦法了。
二就是一直在尋找但還是沒有找到的方法,windows本身是否就有支持這種延遲拖拽的功能。我覺得是有的,因為這種延遲拖拽已經被很多程式實作了,最典型的就是壓縮軟體,無論把壓縮檔案里的檔案拖拽到哪里或者哪個程式里,他都能正常地將檔案先解壓到臨時檔案夾下,再把檔案拖拽到當初的目標地點,只是不知道他的實作方法是什么。
關于方法二,在網上查了很多資料都沒有找到方向,與延遲兩兒字沾邊的mfc封裝的COleDataSource、COleDataObject、COleDataTarget系列里的DelayRenderData、OnDelayRenderData方法也試過,但無論是使用還是看原始碼,這個Delay系列也就只能Delay到拖拽完成,一旦DoDragDrop方法回傳,這些Delay也就壽終正寢不再被回呼了,也不知道是不是我理解的有問題。
希望各位能給一些指導建議。
uj5u.com熱心網友回復:
不可能的,DoDragDrop回傳拖動就全部完成了,什么意思,source或者target的container是explorer.exe,這誰知道具體是怎么做的,只能慢慢試,估計傳給DoDragDrop的IDataObject要添加相關的shell資訊uj5u.com熱心網友回復:
我用一種手段間接實作了從我的軟體里復制,到資源管理器里面粘貼,然后把我軟體里的某些資料寫入目標成為檔案,不知道你想做的是什么東東,我是看360云盤復制檔案到資源管理器的方案,自己嘗試的uj5u.com熱心網友回復:
拖過去的不是檔案, 而是一個等待執行的動作.uj5u.com熱心網友回復:
目前我也碰到這個 發送檔案的問題。。樓主能提供下拖拽檔案發送到目標視窗功能的原始碼嗎?uj5u.com熱心網友回復:
我也有類似問題,常識各種辦法沒有解決。延遲拖拽的問題是,COleDataSource::OnRenderFileData()函式中CFile只是一個Share檔案,并不是真正的目標檔案,所以想通過CFile找到拖拽的目標目錄無法實作。延遲拖拽針對檔案實作已經沒有問題,在OnBeginDrag里把檔案串列資訊填上,在OnRenderFileData函式中把你要寫的內容寫到CFile中就可以。但是要實作目錄的拖拽,我目前無法實作,在OnBeginDrag里把檔案和目錄資訊都填進去沒問題,但是生成目錄可以,生成檔案時,仍用OnRenderFileData中對CFile去寫,但是會把檔案全部創建到桌面(比如拖到桌面),而無法保留原來檔案的目錄層次關系。uj5u.com熱心網友回復:
樓主,我也碰到這樣的問題。你最后是怎么解決的?能分享一下嗎轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/130539.html
上一篇:qt中布局位置問題
下一篇:使用ole拖拽如何延遲拖拽的問題
