2009-12-04 61 views
0

我正在使用的一些代碼使用COleDataSource::CacheGlobalData,傳遞爲CF_TEXT HGLOBAL指向爲文本分配的一些內存。我還想添加一個數字值,因此放置目標可以訪問文本或數字值。COleDataSource - 在應用程序之間設置拖放數據

這怎麼能輕鬆完成?第二個CacheGlobalData調用是否可以使用不同的CF_值進行調用?而且由於我只想傳遞一個整數(DWORD),我可以避免必須分配一個凌亂的HGLOBAL?

還是我必須編碼所有我想發送到一塊內存的數據? CacheGlobalData是否只允許將一個對象附加到拖動事件?

回答

0

您可以多次調用CacheGlobalData。對於每個剪貼板格式,剪貼板都會存儲由CacheGlobalData設置的最後一個值。例如,當您拖動一段文本時,IE會以CF_UNICODETEXT,CF_TEXT和CF_HTML格式存儲數據。通常,應用程序應該儘可能多地提供數據,以便更多的應用程序可以識別數據。

爲了避免往返行程中的數據丟失,應該首先將包含大部分信息的剪貼板格式放置在剪貼板上,然後是較少描述的格式。例如,CF_HTML第一個,CF_UNICODETEXT第二個和CF_TEXT最後一個。

您可能需要註冊自己的數值格式,並修改可以理解您自己格式的放置目標應用程序。沒有一種標準格式需要數字值。

剪貼板數據必須存儲在全局內存中。如果你不喜歡這樣,你可以傳遞NULL並處理WM_RENDERFORMAT或WM_RENDERALLFORMATS消息以在需要時提供數據,但對於DWORD則不值得費力。

+0

因此,沒有內置類型來傳遞單個DWORD?這看起來很奇怪,當你只想傳遞一個ID時,它會節省很多麻煩。我想你可以使用HGlobal句柄來傳遞一個DWORD值。我不認爲這是一個好主意,但是有沒有理由不起作用? – 2009-12-07 09:04:02

+0

其他程序會被誤導(通過您的格式聲明),認爲它是內存句柄,並拖動它們可能會導致意外的行爲。你沒有它們的源代碼,所以你不知道它們是否都在處理拖拽之前檢查數據的完整性。 – 2009-12-07 15:40:26

相關問題