このトピックでは、MFC アプリケーション内で標準の Windows クリップボード API を使用する方法について説明します。
Windows 用のほとんどのアプリケーションでは、データの切り取りまたは Windows クリップボードへのコピー、およびクリップボードからのデータの貼り付けがサポートされています。 クリップボードのデータ形式は、アプリケーションによって異なります。 フレームワークでは、限られた数のクラスに対して限られた数のクリップボード形式のみがサポートされます。 通常は、ビューの [編集] メニューにクリップボード関連のコマンド (切り取り、コピー、貼り付け) を実装します。 クラス ライブラリは、ID_EDIT_CUT、ID_EDIT_COPY、ID_EDIT_PASTEのコマンド ID を定義します。 メッセージ行プロンプトも定義されます。
フレームワークのメッセージとコマンドでは、 メニュー コマンドをハンドラー関数にマッピングして、アプリケーションでメニュー コマンドを処理する方法について説明します。 アプリケーションが [編集] メニューのクリップボード コマンドのハンドラー関数を定義していない限り、それらは無効のままです。 Cut コマンドと Copy コマンドのハンドラー関数を記述するには、アプリケーションで選択を実装します。 Paste コマンドのハンドラー関数を記述するには、クリップボードにクエリを実行して、アプリケーションが受け入れ可能な形式のデータが含まれているかどうかを確認します。 たとえば、Copy コマンドを有効にするには、次のようなハンドラーを記述します。
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();
}
[切り取り]、[コピー]、[貼り付け] コマンドは、特定のコンテキストでのみ意味があります。 [切り取り] コマンドと [コピー] コマンドは、何かが選択されている場合にのみ有効にし、[貼り付け] コマンドはクリップボードにある場合にのみ有効にする必要があります。 この動作を提供するには、コンテキストに応じてこれらのコマンドを有効または無効にする更新ハンドラー関数を定義します。 詳細については、「 User-Interface オブジェクトを更新する方法」を参照してください。
Microsoft Foundation クラス ライブラリでは、 CEdit
クラスと CEditView
クラスを使用したテキスト編集をクリップボードでサポートしています。 OLE クラスは、OLE 項目を含むクリップボード操作の実装も簡略化します。 OLE クラスの詳細については、「 クリップボード: OLE クリップボード メカニズムの使用」を参照してください。
元に戻す (ID_EDIT_UNDO) ややり直し (ID_EDIT_REDO) など、その他の編集メニュー コマンドの実装も任されています。 アプリケーションでこれらのコマンドがサポートされていない場合は、Visual C++ リソース エディターを使用してリソース ファイルから簡単に削除できます。