クリップボード : Windows クリップボードの使用方法
更新 : 2007 年 11 月
MFC アプリケーションで Windows 標準クリップボード API を使用する方法について説明します。
多くの Windows 用アプリケーションでは、Windows クリップボードへのデータの切り取りまたはコピー、およびクリップボードからのデータの貼り付けをサポートしています。クリップボードのデータ形式は、アプリケーションによって異なります。フレームワークでは、一部のクラスに対しての数種類のクリップボード形式だけがサポートされています。通常は、[切り取り]、[コピー]、[貼り付け] など、クリップボード関連のコマンドをビューの [編集] メニューに実装します。クラス ライブラリには、これらのコマンドのコマンド ID として、ID_EDIT_CUT、ID_EDIT_COPY、および ID_EDIT_PASTE が定義されています。また、それぞれのメッセージ行プロンプトも定義されています。
「フレームワークのメッセージとコマンド」では、メニュー コマンドをハンドラ関数に割り当て、アプリケーションでメニュー コマンドを処理する方法について説明します。アプリケーションの [編集] メニューのクリップボード コマンドのハンドラ関数を定義しない限り、クリップボード コマンドは無効のままです。[切り取り] および [コピー] コマンドのハンドラ関数を作成する場合は、アプリケーションにデータを選択する機能を実装してください。[貼り付け] コマンドのハンドラ関数を作成する場合は、クリップボードに問い合わせて、格納されているデータがアプリケーションで処理可能な形式かどうかを調べる必要があります。たとえば、[コピー] コマンドを有効にするには、次のようなハンドラを記述します。
void CMyListView::OnEditCopy()
{
if ( !OpenClipboard() )
{
AfxMessageBox( _T("Cannot open the Clipboard") );
return;
}
// Remove the current Clipboard contents
if( !EmptyClipboard() )
{
AfxMessageBox( _T("Cannot empty the Clipboard") );
return;
}
// 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...
if ( ::SetClipboardData( CF_TEXT, hGlob ) == NULL )
{
CString msg;
msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError());
AfxMessageBox( msg );
CloseClipboard();
GlobalFree(hGlob);
return;
}
CloseClipboard();
}
[切り取り]、[コピー]、および [貼り付け] コマンドは、特定のコンテキストでだけ意味を持ちます。[切り取り] および [コピー] コマンドは、データが選択されている場合にだけ有効になります。[貼り付け] コマンドは、データがクリップボードにある場合にだけ有効になります。このような動作を実現するには、コンテキストに応じてコマンドを有効または無効にする更新ハンドラ関数を定義します。詳細については、「ユーザー インターフェイス オブジェクトの更新方法」を参照してください。
Microsoft Foundation Class ライブラリは、CEdit クラスおよび CEditView クラスによるテキスト編集用にクリップボード機能をサポートしています。また、OLE クラスでは、OLE アイテムを扱うクリップボード操作を簡単に実装できます。OLE クラスの詳細については、「クリップボード : OLE クリップボード機構の使用方法」を参照してください。
ほかの [編集] メニュー コマンド、たとえば [元に戻す] (ID_EDIT_UNDO)、[やり直し] (ID_EDIT_REDO) などは自由に実装できます。アプリケーションがこれらのコマンドをサポートしない場合は、Visual C++ のリソース エディタを使用してリソース ファイルから簡単に削除できます。