クリップボード : OLE クリップボード機構の使用方法
更新 : 2007 年 11 月
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();
}