檢視原始碼 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-type 字串常值的形式給出,例如 "application/word" 或 "image/png"。這些字串在 Unix 下 (目前只有 GTK+) 直接使用,以識別格式,並在 Win32 下轉換為其 Windows 對應的字串 (使用 OLE IDataObject 進行剪貼簿和拖放的資料交換)。請注意,Windows 下的格式字串轉換尚未完成。
每個直接從 wxDataObject
派生的類別都必須覆寫並實作其所有在基底類別中為純虛擬的函式。僅呈現其資料或僅設定資料的資料物件 (即僅在一個方向上運作),應從 GetFormatCount()
(wx 中未實作) 返回 0。
參閱
wxWidgets 文件:wxDataObject
摘要
類型
-type wxDataObject() :: wx:wx_object().