次の方法で共有


データ オブジェクトとデータ ソース : 操作

データ オブジェクトまたはデータ ソースを作成した後は、データの挿入と削除、データの形式の列挙など、データに対して多くの一般的な操作を実行できます。 この記事では、最も一般的な操作を完了するために必要な手法について説明します。 ここでは、次の内容について説明します。

データ ソースへのデータの挿入

データ ソースへのデータの挿入方法は、データが即時に提供されるか、またはオンデマンドで提供されるか、どのような媒体によって提供されるかで異なります。 設定できる値は次のとおりです。

即時のデータ提供 (即時レンダリング)

  • データを提供するすべてのクリップボード形式に対して、COleDataSource::CacheGlobalData を繰り返し呼び出します。 使用するクリップボード形式、データを格納するメモリへのハンドル、および必要に応じてデータを記述する FORMATETC 構造体を渡します。

    または

  • STGMEDIUM 構造体を直接操作する場合は、上のオプションで COleDataSource::CacheGlobalData の代わりに COleDataSource::CacheData を呼び出します。

オンデマンドのデータ提供 (遅延レンダリング)

これは高度なトピックです。

  • データを提供するすべてのクリップボード形式に対して、COleDataSource::DelayRenderData を繰り返し呼び出します。 使用するクリップボード形式と、必要に応じて、データを記述する FORMATETC 構造体を渡します。 データが要求されると、フレームワークは COleDataSource::OnRenderData を呼び出します。これは、オーバーライドする必要があります。

    または

  • CFile オブジェクトを使用してデータを提供する場合は、前のオプションで COleDataSource::DelayRenderData の代わりに COleDataSource::DelayRenderFileData を呼び出します。 データが要求されると、フレームワークは COleDataSource::OnRenderFileData を呼び出します。これは、オーバーライドする必要があります。

データ オブジェクトで使用できる形式の確認

アプリケーションにデータを貼り付けられるようにするには、クリップボードで処理できる形式について確認する必要があります。 これにはアプリケーションで次の操作を行う必要があります。

  1. COleDataObject オブジェクトと FORMATETC 構造体を作成します。

  2. データ オブジェクトの AttachClipboard メンバー関数を呼び出して、データ オブジェクトをクリップボードのデータに関連付けます。

  3. 次のいずれかの操作を行います。

    • 必要な形式が 1 つまたは 2 つしかない場合は、データ オブジェクトの IsDataAvailable メンバー関数を呼び出します。 これにより、クリップボードのデータがアプリケーションよりもはるかに多くの形式をサポートする場合には、時間を節約できます。

      または

    • データ オブジェクトの BeginEnumFormats メンバー関数を呼び出して、クリップボードで使用可能な形式の列挙を開始します。 次に、アプリケーションがサポートする形式をクリップボードが返すか、またはそれ以上形式がなくなるまで GetNextFormat を呼び出します。

ON_UPDATE_COMMAND_UI を使用すると、[編集] メニューの [貼り付け] を有効にし、場合によっては [形式を選択して貼り付け] 項目を有効にすることもできます。 これを行うには、CMenu::EnableMenuItem または CCmdUI::Enable を呼び出します。 どのコンテナー アプリケーションがメニュー項目をいつ操作するかの詳細については、「メニューとリソース: コンテナーの変更点」をご覧ください。

データ オブジェクトからのデータの取得

データ形式を決定した後は、残っている手順はデータ オブジェクトからデータを取得することだけです。 これを行うために、ユーザーはデータを配置する場所を決定し、アプリケーションは適切な関数を呼び出します。 データは、次のいずれかのメディアで使用できます。

呼び出す関数
グローバル メモリ (HGLOBAL) COleDataObject::GetGlobalData
File (CFile) COleDataObject::GetFileData
STGMEDIUM 構造体 (IStorage) COleDataObject::GetData

通常、メディアはクリップボード形式と共に指定されます。 たとえば、CF_EMBEDDEDSTRUCT オブジェクトは常に、STGMEDIUM 構造体を必要とする IStorage メディアの中にあります。 したがって、STGMEDIUM 構造体を受け入れることができる唯一の関数は GetData であるため、それを使用します。

クリップボード形式が IStream または HGLOBAL メディアの場合、フレームワークはデータを参照する CFile ポインターを提供できます。 次に、ファイル読み取りを使用して、ファイルからデータをインポートする場合とほぼ同じ方法でデータを取得できます。 基本的に、これはデータ ソース内の OnRenderData ルーチンと OnRenderFileData ルーチンに対するクライアント側のインターフェイスです。

これで、ユーザーは、同じ形式の他のデータと同じように、ドキュメントにデータを挿入できるようになりました。

さらに詳しい情報

関連項目

データ オブジェクトとデータ ソース (OLE)
COleDataObject クラス
COleDataSource クラス