次の方法で共有


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

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

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

データ ソースにデータを挿入する方法は、データがすぐに提供されるかオンデマンドで提供されるか、どのメディアでデータが提供されるかによって異なります。 可能性は次のとおりです。

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

  • データを提供するすべてのクリップボード形式に対して 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
ファイル (CFile) COleDataObject::GetFileData
STGMEDIUM 構造体 (IStorage) COleDataObject::GetData

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

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

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

詳しく知りたいこと

こちらも参照ください

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