クリップボード : Windows クリップボードの使用方法
このトピックでは、MFC アプリケーション内で標準的な Windows Clipboard API を使用する方法について説明します。
Windows のアプリケーションは、そのほとんどが Windows クリップボードへのデータの切り取りと、クリップボードからのデータの貼り付けをサポートしています。 クリップボード データの形式は、アプリケーションによってさまざまです。 フレームワークでは、限られたクラスの限られた数のクリップボード形式しかサポートされません。 通常、クリップボードに関連したコマンド (切り取り、コピー、貼り付け) は、ビューの [編集] メニューに実装します。 ID_EDIT_CUT、ID_EDIT_COPY、ID_EDIT_PASTE の各コマンドには、クラス ライブラリでコマンド ID が定義されています。 また、それぞれのメッセージ行のプロンプトも定義されています。
アプリケーション内でメニュー コマンドをハンドラー関数にマッピングすることによりメニュー コマンドを処理する方法については、「フレームワークのメッセージとコマンド」で説明しています。 アプリケーションの [編集] メニューにクリップボード コマンドのハンドラー関数が定義されない限り、それらは無効な状態のままです。 切り取りコマンドとコピー コマンドのハンドラー関数を作成するには、アプリケーションに選択範囲を実装します。 貼り付けコマンドのハンドラー関数を作成するには、アプリケーションが受け付けることのできる形式のデータが格納されているかどうかをクリップボードに照会して確認します。 たとえば、コピー コマンドを有効にするためには、次のようなハンドラーを記述することになります。
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++ リソース エディターを使用して、それらをリソース ファイルから簡単に削除できます。