查看源代码 wxDataObject (wx v2.4.3)
wxDataObject
表示可以复制到剪贴板或从剪贴板复制,或者拖放的数据。
wxDataObject
的重要之处在于,它是一种“智能”数据,与内存缓冲区或文件等“哑”数据容器不同。“智能”在这里意味着数据对象本身应该知道它支持哪些数据格式,以及如何在它支持的每种格式中呈现自身。
顺便说一句,支持的格式正是可以从数据对象请求数据或从中设置数据对象的格式。在一般情况下,一个对象可能在“输入”和“输出”上支持不同的格式,即它可能能够以给定的格式呈现自身,但不能从这种格式的数据创建,反之亦然。wxDataObject
定义了 wxDataObject::Direction
(在 wx 中未实现)枚举类型,用于区分它们。
有关格式的更多信息,请参阅 wxDataFormat
(在 wx 中未实现)文档。
毫不奇怪,“智能”是以增加复杂性为代价的。对于您确实需要支持多种格式的情况来说,这是合理的,但如果您只想做一些简单的操作(如剪切和粘贴文本),则可能会很烦人。
为了为这两种情况提供解决方案,wxWidgets 提供了两个从 wxDataObject
派生的预定义类:wxDataObjectSimple
(在 wx 中未实现)和 wxDataObjectComposite
(在 wx 中未实现)。wxDataObjectSimple
(在 wx 中未实现)是最简单的 wxDataObject
,仅以单一格式(如 HTML 或文本)保存数据,而 wxDataObjectComposite
(在 wx 中未实现)是实现支持多种格式的 wxDataObject
的最简单方法,因为它通过简单地保存多个 wxDataObjectSimple
(在 wx 中未实现)对象来实现这一点。
因此,当您需要一个 wxDataObject
类时,您有几种解决方案(一旦您想通过剪贴板或拖放传输数据,您就需要一个)
请注意,使用多种格式进行拖放和剪贴板的最简单方法是使用 wxDataObjectComposite
(在 wx 中未实现),但它不是最有效的方法,因为每个 wxDataObjectSimple
(在 wx 中未实现)都将包含其各自格式的整个数据。现在想象一下,您想将 200 页文本以您专有的格式以及 Word、RTF、HTML、Unicode 和纯文本粘贴到剪贴板,即使是今天的计算机也会遇到麻烦。对于这种情况,您将必须直接从 wxDataObject
派生,并使其枚举其格式并按需提供请求格式的数据。
请注意,剪贴板和拖放的 GTK+ 数据传输机制以及 OLE 数据传输,在另一个应用程序实际请求数据之前,都不会 复制
任何数据。这与程序用户通常认为按下“复制”后数据驻留在剪贴板中的“感觉”形成对比 - 实际上它只是声明为 可用
。
您还可以从 wxCustomDataObject
(在 wx 中未实现)派生您自己的数据对象类,以用于用户定义的类型。用户定义数据的格式以 mime 类型字符串文字给出,例如“application/word”或“image/png”。这些字符串在 Unix(到目前为止仅限 GTK+)下按原样使用以识别格式,并在 Win32 下转换为其 Windows 等效项(使用 OLE IDataObject 进行数据交换到剪贴板和从剪贴板交换,以及用于拖放)。请注意,Windows 下的格式字符串转换尚未完成。
每个直接从 wxDataObject
派生的类都必须覆盖并实现其所有在基类中为纯虚函数的函数。仅呈现数据或仅设置数据(即仅在一个方向上工作)的数据对象应从 GetFormatCount()
(在 wx 中未实现)返回 0。
请参阅
wxWidgets 文档:wxDataObject
摘要
类型
-type wxDataObject() :: wx:wx_object().