建立資料物件或數據源之後,您可以對資料執行許多常見作業,例如插入和移除數據、列舉數據的格式等等。 本文說明完成最常見作業所需的技術。 主題包括:
將數據插入數據源
數據插入數據源的方式取決於視數據是立即提供還是按需提供,以及數據以何種媒介被提供。 可能性如下。
立即提供資料 (立即渲染)
針對您提供數據的每個剪貼簿格式重複呼叫
COleDataSource::CacheGlobalData。 傳遞要使用的剪貼簿格式、包含數據的記憶體句柄,以及選擇性地傳遞描述數據的 FORMATETC 結構。-或-
如果您要直接使用 STGMEDIUM 結構,請在上述選項中呼叫
COleDataSource::CacheData而不是COleDataSource::CacheGlobalData。
視需要提供資料(延遲轉譯)
這是進階主題。
針對您提供數據的每個剪貼簿格式重複呼叫
COleDataSource::DelayRenderData。 傳遞要使用的剪貼簿格式,並選擇性地傳遞描述數據的 FORMATETC 結構。 要求數據時,架構會呼叫COleDataSource::OnRenderData,您必須覆寫此架構。-或-
如果您使用
CFile物件來提供資料,請呼叫COleDataSource::DelayRenderFileData而不是COleDataSource::DelayRenderData。 要求數據時,架構會呼叫COleDataSource::OnRenderFileData,您必須覆寫此架構。
判斷數據物件中可用的格式
在應用程式允許使用者將數據貼入其中之前,它必須知道剪貼簿上是否有可處理的格式。 若要這樣做,您的應用程式應該執行下列動作:
建立
COleDataObject物件和 FORMATETC 結構。呼叫數據對象
AttachClipboard的成員函式,以將數據物件與剪貼簿上的數據產生關聯。請執行下列其中一項動作:
如果只需要一或兩種格式,請呼叫數據對象
IsDataAvailable的成員函式。 如果剪貼簿上的數據比應用程式支援的格式要高得多,這可節省您的時間。-或-
呼叫資料對象
BeginEnumFormats的成員函式,開始列舉剪貼簿上可用的格式。 然後呼叫GetNextFormat,直到剪貼簿傳回應用程式支援的格式,或沒有其他格式。
如果您使用 ON_UPDATE_COMMAND_UI,您現在可以在 [編輯] 功能表上啟用 [貼上] 和可能的 [選擇性貼上] 項目。 若要這樣做,請呼叫 CMenu::EnableMenuItem 或 CCmdUI::Enable。 如需瞭解容器應用程式應何時及如何使用功能表項的詳細資訊,請參閱 功能表和資源:容器新增。
從 Dialog 物件擷取資料
一旦您決定數據格式之後,剩下的就是從數據物件擷取數據。 若要這樣做,用戶會決定放置數據的位置,而應用程式會呼叫適當的函式。 資料將在下列其中一種媒體中提供:
| 中等 | 要呼叫的函式 |
|---|---|
全域記憶體 (HGLOBAL) |
COleDataObject::GetGlobalData |
檔案 (CFile) |
COleDataObject::GetFileData |
STGMEDIUM 結構 (IStorage) |
COleDataObject::GetData |
通常,媒體會連同其剪貼簿格式一起指定。 例如,CF_EMBEDDEDSTRUCT 物件總是在IStorage 需要 STGMEDIUM 結構的媒體中。 因此,您會使用 GetData ,因為它是唯一可以接受 STGMEDIUM 結構的其中一個函式。
若剪貼簿格式為 IStream 或 HGLOBAL 媒介,架構可以提供指向數據的 CFile 指標。 然後,應用程式可以使用檔案讀取來取得數據的方式與從檔案匯入數據的方式大致相同。 基本上,這是數據源中OnRenderData 與 OnRenderFileData 例程序的用戶端介面。
用戶現在可以將數據插入檔中,就像使用相同格式的任何其他數據一樣。