クリップボード : OLE クリップボード機構の使用方法
OLE では、クリップボードを使用してデータを転送するために、標準形式といくつかの OLE 固有の形式が使用されます。
アプリケーションからデータを切り取ったりコピーしたりすると、データはクリップボードに保存され、後で貼り付け操作で使用できるようになります。 このデータは、さまざまな形式になっています。 ユーザーがクリップボードからデータを貼り付けることを選択した場合、アプリケーションでは、使用する形式を選択できます。 アプリケーションは、ユーザーが特に特定の形式を指定しない限り、特殊な貼り付けを使用して、最も多くの情報を提供する形式を選択するように記述する必要があります。 続行する前に、「データ オブジェクトとデータ ソース (OLE)」のトピックを読まれることをお勧めします。 これらの例では、データ転送のしくみと、それらをアプリケーションに実装する方法の基本について説明します。
Windows は、クリップボードを介してデータを転送するために使用できる標準形式の数を定義します。 これには、メタファイル、テキスト、ビットマップなどが含まれます。 OLE では、多くの OLE 固有の書式も定義されています。 これらの標準形式よりも詳細な情報が必要なアプリケーションの場合は、独自のカスタム クリップボード形式を登録することをお勧めします。 これを行うには、Win32 API 関数 RegisterClipboardFormat を使用します。
たとえば、Microsoft Excel は、スプレッドシートのカスタム書式を登録します。 この形式には、ビットマップなど、より多くの情報が含まれています。 スプレッドシート形式をサポートするアプリケーションにこのデータが貼り付けられると、スプレッドシートのすべての数式と値が保持され、必要に応じて更新できます。 また Microsoft Excel は、クリップボードのデータを OLE アイテムとして貼り付けることができるように、データを形式で格納します。 OLE ドキュメント コンテナーでは、この情報を埋め込みアイテムとして貼り付けることができます。 この埋め込み項目は Microsoft Excel を使用して変更できます。 クリップボードには、スプレッドシート上で選択された範囲のイメージの単純なビットマップも含まれています。 これは、OLE ドキュメント コンテナーに貼り付けることも、ペイントなどのビットマップ エディターに貼り付けることもできます。 ただし、ビットマップの場合は、データをスプレッドシートとして操作する方法はありません。
クリップボードからできるだけ多くの情報を取得するには、クリップボードからデータを貼り付ける前に、アプリケーションでこれらのカスタム形式を確認する必要があります。
たとえば、カット コマンドを有効にするためには、次のようなハンドラーを記述することになります:
void CMyListView::OnEditCut()
{
// Create an OLE data source on the heap
COleDataSource* pData = new COleDataSource;
// Get the currently selected data
HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64);
strcpy_s((char*)hGlob, 64, "Current selection\r\n");
// For the appropriate data formats...
pData->CacheGlobalData( CF_TEXT, hGlob );
// The Clipboard now owns the allocated memory
// and will delete this data object
// when new data is put on the Clipboard
pData->SetClipboard();
}