C++ COleDataSource-设置拖放;在应用程序之间删除数据

C++ COleDataSource-设置拖放;在应用程序之间删除数据,c++,mfc,drag-and-drop,ole,C++,Mfc,Drag And Drop,Ole,我正在处理的一些代码使用COleDataSource::CacheGlobalData,将指向为文本分配的内存的HGLOBAL作为CF_文本传递。我还想添加一个数值,以便拖放目标可以访问文本或数值 这怎么容易做到?第二次CacheGlobalData调用是否可以使用不同的CF_uu值进行?既然我只想传递一个整数(DWORD),我能避免分配一个混乱的HGLOBAL吗 或者我必须将所有要发送的数据编码到单个内存块中吗?CacheGlobalData是否只允许将一个对象附加到拖动事件?您可以多次调用C

我正在处理的一些代码使用
COleDataSource::CacheGlobalData
,将指向为文本分配的内存的HGLOBAL作为CF_文本传递。我还想添加一个数值,以便拖放目标可以访问文本或数值

这怎么容易做到?第二次CacheGlobalData调用是否可以使用不同的CF_uu值进行?既然我只想传递一个整数(DWORD),我能避免分配一个混乱的HGLOBAL吗


或者我必须将所有要发送的数据编码到单个内存块中吗?CacheGlobalData是否只允许将一个对象附加到拖动事件?

您可以多次调用CacheGlobalData。对于每个剪贴板格式,剪贴板存储CacheGlobalData设置的最后一个值。例如,当您拖动一段文本时,IE以CF_UNICODETEXT、CF_TEXT和CF_HTML格式存储数据。通常,应用程序应提供尽可能多的格式的数据,以便更多的应用程序能够识别数据

为避免数据在往返过程中丢失,应首先将包含最多信息的剪贴板格式放置在剪贴板上,然后再放置描述性较差的格式。例如,首先是CF_HTML,其次是CF_UNICODETEXT,最后是CF_TEXT

您可能需要为数值注册自己的格式,并修改可以理解自己格式的drop target应用程序。没有一种标准格式采用数值


剪贴板数据必须存储在全局内存中。如果您不喜欢,可以传递NULL并处理WM_RENDERFORMAT或WM_RenderFormats消息,以便在需要时提供数据,但对于DWORD来说,这并不值得付出努力。

所以没有用于传递单个DWORD的内置类型?这看起来真的很奇怪,当你只想传递一个身份证的时候,这会省去很多麻烦。我想您可以使用HGlobal句柄传递单个DWORD值。我不认为这是一个好主意,但是有没有理由它不起作用呢?其他程序可能会被误导(被你的格式声明所误导)认为它是一个内存句柄,并且拖过它们可能会导致意外的行为。您没有它们的源代码,因此不知道它们是否都在处理拖拽之前检查数据完整性。