テクニカル ノート 22: 標準コマンドの実装
Note
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。 結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。 最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
このノートでは、MFC 2.0 で提供される標準のコマンド実装について説明します。 標準コマンドの多くを実装するために使用されるメカニズムが説明されているので、まずテクニカル ノート 21 を読んでください。
この説明は、MFC アーキテクチャ、API、および一般的なプログラミングプラクティスに関する知識を前提とします。 文書化されていない "実装のみ" API について説明します。 これは、 MFC の機能や MFC でのプログラム方法について学習を始める場所ではありません。 一般的な情報や文書化された API の詳細については、Visual C++ を参照してください。
問題
MFC では、ヘッダー ファイル AFXRES.H に多数の標準コマンド ID が定義されています。 これらのコマンドに対するフレームワークのサポートは異なります。 フレームワーク クラスがこれらのコマンドを処理する場所と方法を理解すると、フレームワークが内部的にどのように動作するのかだけでなく、標準の実装をカスタマイズし、独自のコマンド ハンドラーを実装する手法に関する有用な情報が提供されます。
このテクニカル ノートの内容
各コマンド ID については、次の 2 つのセクションで説明します:
タイトル: コマンド ID のシンボリック名 (ID_FILE_SAVE など) の後にコマンドの目的 (たとえば、"現在のドキュメントを保存する") がコロンで区切られて示されます。
コマンドを実装するクラスと既定の実装の動作を記述する 1 つ以上の段落
ほとんどの既定のコマンド実装は、フレームワークの基本クラス のメッセージ マップに事前に接続されています。 派生クラスに明示的な接続を必要とするコマンド実装がいくつかあります。 これらは 、"Note" の下に説明されています。 AppWizard で適切なオプションを選択した場合は、生成されたスケルトン アプリケーションでこれらの既定のハンドラーが自動的に接続されます。
命名規則
標準コマンドは、可能であれば使用することをお勧めする単純な名前付け規則に従います。 ほとんどの標準コマンドは、アプリケーションのメニュー バーの標準の場所に表示されます。 コマンドのシンボリック名は、"ID_" の後に標準のポップアップ メニュー名が続き、その後にメニュー項目名が続きます。 シンボリック名は大文字で、アンダースコアの単語区切りが付きます。 標準メニュー項目名を持つコマンドの場合、論理コマンド名は "ID_" (たとえば、ID_NEXT_PANE) で始まると定義されています。
プレフィックス "ID_" を使用して、メニュー項目、ツール バー ボタン、または他のコマンド ユーザー インターフェイス オブジェクトにバインドするように設計されたコマンドを示します。 "ID_" コマンドを処理するコマンド ハンドラーでは、MFC コマンド アーキテクチャの ON_COMMAND および ON_UPDATE_COMMAND_UI メカニズムを使用する必要があります。
コマンド アーキテクチャに従い、メニュー固有のコードを有効または無効にする必要があるメニュー項目には、標準の "IDM_" プレフィックスを使用することをお勧めします。 もちろん、メニュー固有のコマンドの数は少ない必要があります。MFC コマンド アーキテクチャに従うと、コマンド ハンドラーの機能がよりパワフルになるだけでなく (ツール バーで動作するため)、コマンド ハンドラー コードを再利用可能になるためです。
ID の範囲
MFC での ID 範囲の使用の詳細については、テクニカル ノート 20 を参照してください。
MFC 標準コマンドは、0xE000 から 0xEFFF の範囲になります。 これらの ID 値は、ライブラリの将来のバージョンで変更される可能性があるため、特定の値に依存しないでください。
アプリケーションでは、0x8000 から 0xDFFF の範囲のコマンドを定義しなければなりません。
標準コマンド ID
コマンド ID ごとに、標準のメッセージ行プロンプト文字列がファイル PROMPTS.RC に含まれます。 そのメニュー プロンプトの文字列 ID は、コマンド ID と同じである必要があります。
ID_FILE_NEW 新しいドキュメントまたは空のドキュメントを作成します。
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。CWinApp::OnFileNew
は、アプリケーション内のドキュメント テンプレートの数に応じて、このコマンドを異なる方法で実装します。CDocTemplate
が 1 つしかない場合、CWinApp::OnFileNew
により、その型の新しいドキュメントと、適切なフレームおよびビュー クラスが作成されます。CDocTemplate
が複数ある場合は、CWinApp::OnFileNew
により使用するドキュメントの種類を選択できるダイアログ (AFX_IDD_NEWTYPEDLG) をユーザーに求めるメッセージが表示されます。 選択されたCDocTemplate
が、ドキュメントの作成に使用されます。ID_FILE_NEW の一般的なカスタマイズには、ドキュメントの種類の異なるグラフィカルな選択肢を提供することがあります。 この場合は、独自の
CMyApp::OnFileNew
を実装し、CWinApp::OnFileNew
ではなくメッセージ マップに配置できます。 基本クラスの実装を呼び出す必要はありません。別の一般的な ID_FILE_NEW のカスタマイズは、各種類のドキュメントを作成するための個別のコマンドを提供する方法です。 この場合は、新しいコマンド ID を定義する必要があります。たとえば、ID_FILE_NEW_CHARTとID_FILE_NEW_SHEET があります。
ID_FILE_OPEN により既存のドキュメントが開かれます。
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。CWinApp::OnFileOpen
には、CWinApp::DoPromptFileName
を呼び出し、開くファイルのファイル名またはパス名を指定してCWinApp::OpenDocumentFile
を呼び出すという非常に単純な実装があります。CWinApp
実装ルーチンDoPromptFileName
は、 標準の FileOpen ダイアログを表示し、現在のドキュメント テンプレートから取得したファイル拡張子を入力します。FileOpen ダイアログをカスタマイズするか、ファイル フィルターを追加することが ID_FILE_OPEN の一般的なカスタマイズです。 これをカスタマイズする推奨される方法は、既定の実装を独自の FileOpen ダイアログに置き換え、
CWinApp::OpenDocumentFile
をドキュメントのファイル名またはパス名で呼び出す方法です。 基本クラスの実装を呼び出す必要はありません。ID_FILE_CLOSE により、現在開いているドキュメントが閉じられます。
CDocument::OnFileClose
によりCDocument::SaveModified
を呼び出して、ドキュメントが変更されている場合は保存するようにユーザーに求め、OnCloseDocument
を呼び出します。 ドキュメントの破棄を含むすべての終了ロジックは、OnCloseDocument
ルーチンで実行されます。Note
ID_FILE_CLOSE は、ドキュメント フレーム ウィンドウに送信された WM_CLOSE メッセージまたは SC_CLOSE システム コマンドとは動作が異なります。 ウィンドウを閉じると、ドキュメントが最後に表示されているフレーム ウィンドウである場合にのみ、ドキュメントが閉じされます。 ID_FILE_CLOSE でドキュメントを閉じると、ドキュメントを閉じるだけでなく表示しているすべてのフレーム ウィンドウが閉じます。
ID_FILE_SAVE により現在のドキュメントが保存されます。
実装では、
OnFileSave
とOnFileSaveAs
の両方に使用されるヘルパー ルーチンCDocument::DoSave
を使用します。 以前に保存されていないドキュメント (つまり、FileNew の場合のようにパス名を持たない) または読み取り専用ドキュメントから読み取ったドキュメントを保存した場合、OnFileSave
ロジックは ID_FILE_SAVE_AS コマンドのように動作し、ユーザーに新しいファイル名を提示するよう指示します。 ファイルを開いて保存を行う実際のプロセスは、仮想関数OnSaveDocument
を使用して行われます。ID_FILE_SAVE をカスタマイズする一般的な理由は 2 つあります。 保存しないドキュメントの場合は、ユーザー インターフェイスから ID_FILE_SAVE メニュー項目とツール バー ボタンを削除するだけです。 また、ドキュメントを汚さない (つまり、
CDocument::SetModifiedFlag
を呼び出さない) ようにし、フレームワークによってドキュメントが保存されないようにします。 ディスク ファイル以外の場所に保存するドキュメントの場合は、その操作の新しいコマンドを定義します。COleServerDoc
の場合、ファイルの保存 (通常のドキュメントの場合) とファイルの更新 (埋め込みドキュメントの場合) の両方に ID_FILE_SAVE が使用されます。ドキュメント データが個々のディスク ファイルに格納されているが、既定の
CDocument
シリアル化実装を使用しない場合は、OnFileSave
ではなくCDocument::OnSaveDocument
をオーバーライドする必要があります。ID_FILE_SAVE_AS により、現在のドキュメントが別のファイル名で保存されます。
CDocument::OnFileSaveAs
実装では、同じCDocument::DoSave
ヘルパー ルーチンをOnFileSave
として使用します。OnFileSaveAs
コマンドは、保存前にドキュメントにファイル名がない場合 はID_FILE_SAVE として処理されます。COleServerDoc::OnFileSaveAs
は、通常のドキュメント データ ファイルを保存したり、他のアプリケーションに埋め込まれた OLE オブジェクトを表すサーバー ドキュメントを別のファイルとして保存したりするためのロジックを実装します。ID_FILE_SAVE のロジックをカスタマイズする場合は、同様の方法で ID_FILE_SAVE_AS をカスタマイズしたい場合や、"名前を付けて保存" の操作がドキュメントに適用されない場合があります。 必要ない場合は、メニュー バーからメニュー項目を削除できます。
ID_FILE_SAVE_COPY_AS は、現在のドキュメントを新しい名前で保存します。
COleServerDoc::OnFileSaveCopyAs
実装はCDocument::OnFileSaveAs
と非常に似ていますが、保存後にドキュメント オブジェクトが基になるファイルに "アタッチ" されない点が異なります。 つまり、メモリ内のドキュメントが保存前に "変更" された場合でも、そのドキュメントは "変更" されます。 さらに、このコマンドは、ドキュメントに格納されているパス名またはタイトルには影響しません。ID_FILE_UPDATE は、埋め込みドキュメントを保存するコンテナーに通知します。
COleServerDoc::OnUpdateDocument
実装は、埋め込みを保存する必要があるという通知をコンテナーに送信するだけです。 コンテナーは、埋め込みオブジェクトを保存するために適切な OLE API を呼び出します。ID_FILE_PAGE_SETUP は、アプリケーション固有のページセットアップ/レイアウト ダイアログを呼び出します。
現在、このダイアログには標準はありません。フレームワークには、このコマンドの既定の実装はありません。
このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_FILE_PRINT_SETUP は、標準の [印刷セットアップ] ダイアログを呼び出します。
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。このコマンドは、ユーザーが少なくともこのドキュメントまたはこのアプリケーションのすべてのドキュメントのプリンターと印刷設定をカスタマイズできる標準の印刷セットアップ ダイアログを呼び出します。 コントロール パネルを使用して、システム全体の既定のプリンター設定を変更する必要があります。
CWinApp::OnFilePrintSetup
には、CPrintDialog
オブジェクトを作成し、CWinApp::DoPrintDialog
実装関数を呼び出す非常に単純な実装があります。 これにより、アプリケーションの既定のプリンター設定が設定されます。このコマンドをカスタマイズする際の一般的なニーズは、ドキュメントごとにプリンターを設定できるようにすることです。これは、保存時にドキュメントと共に保存する必要があります。 これを行うには、
CPrintDialog
オブジェクトを作成するメッセージマップハンドラーをCDocument
クラスに追加し、適切なプリンター属性 (通常は hDevMode と hDevNames) を使用して初期化し、CPrintDialog::DoModal
を呼び出して、変更されたプリンターの設定を保存します。 堅牢な実装については、エラーを検出するCWinApp::DoPrintDialog
と、実用的な既定値を処理しシステム全体のプリンターの変更を追跡するためCWinApp::UpdatePrinterSelection
の実装を検討する必要があります。ID_FILE_PRINT は、現在のドキュメントの標準印刷を します
Note
この機能を有効にするには、これを
CView
派生クラスのメッセージ マップに接続する必要があります。このコマンドは、現在のドキュメントを印刷します。または、より正確に印刷処理を開始します。これには、標準の [印刷] ダイアログを呼び出し、印刷エンジンを実行します。
CView::OnFilePrint
は、このコマンドとメインの印刷ループを実装します。 このコマンドは、仮想CView::OnPreparePrinting
を呼び出して、ユーザーに対して [印刷] ダイアログでプロンプトを表示します。 次に、プリンターに移動するように出力 DC を準備し、[印刷の進行状況] ダイアログ (AFX_IDD_PRINTDLG) を起動して、StartDoc
エスケープをプリンターに送信 します。CView::OnFilePrint
には、メインページ指向の印刷ループも含まれています。 各ページについて、仮想CView::OnPrepareDC
の後にStartPage
エスケープを呼び出し、そのページの仮想CView::OnPrint
を呼び出します。 完了すると、仮想CView::OnEndPrinting
が呼び出され、[印刷の進行状況] ダイアログボックスが閉じます。MFC の印刷アーキテクチャは、印刷と印刷プレビューのためのさまざまな方法でフックするように設計されています。 通常は、ページ指向の印刷タスクに適したさまざまなオーバーライド可能な
CView
関数を見つけます。 ページ指向以外の出力にプリンターを使用するアプリケーションの場合にのみ、ID_FILE_PRINT の実装を置き換える必要があります。ID_FILE_PRINT_PREVIEW は、現在のドキュメントの印刷/プレビューモードを入力します。
Note
この機能を有効にするには、これを
CView
派生クラスのメッセージ マップに接続する必要があります。CView::OnFilePrintPreview
は、ドキュメント化されたヘルパー関数CView::DoPrintPreview
を呼び出すことにより、印刷プレビューモードを開始します。CView::DoPrintPreview
は、OnFilePrint
が印刷ループのメインエンジンであるのと同じように、印刷プレビューループのメインエンジンです。印刷プレビュー操作は、さまざまなパラメーターを
DoPrintPreview
に渡すことによって、さまざまな方法でカスタマイズできます。 印刷プレビューの詳細とカスタマイズ方法については、「テクニカルノート 30」を参照してください。ID_FILE_MRU_FILE1...FILE16 は、ファイルの MRU リストのコマンド ID の範囲を指定します。
CWinApp::OnUpdateRecentFileMenu
は、ON_UPDATE_COMMAND_UI メカニズムの高度な使用方法の 1 つである更新コマンド UI ハンドラーです。 メニュー リソースでは、ID ID_FILE_MRU_FILE1 を持つメニュー項目を 1 つだけ定義する必要があります。 そのメニュー項目は、最初は無効のままです。MRU リストが拡大するにつれて、一覧により多くのメニュー項目が追加されます。 標準
CWinApp
の実装は、既定では、最近使用した 4 つのファイルの標準制限に設定されています。 より大きな値または小さい値を指定してCWinApp::LoadStdProfileSettings
を呼び出すことによって、既定を変更できます。 MRU リストは、アプリケーションの .INI ファイルに格納されます。LoadStdProfileSettings
を呼び出した場合、リストはアプリケーションのInitInstance
関数に読み込まれ、アプリケーションの終了時に保存されます。 MRU 更新コマンドの UI ハンドラーでは、絶対パスを相対パスに変換して [ファイル] メニューに表示することもできます。CWinApp::OnOpenRecentFile
は、実際のコマンドを実行する ON_COMMAND ハンドラーです。 MRU リストからファイル名を取得し、CWinApp::OpenDocumentFile
を呼び出します。これにより、ファイルを開いて MRU リストを更新する作業がすべて実行されます。このコマンドハンドラーのカスタマイズはお勧めしません。
ID_EDIT_CLEAR は、現在の選択範囲をクリアします
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、CEdit::Clear
を使用して、このコマンドの実装を提供します。 現在選択されていない場合、コマンドは無効になります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_CLEAR_ALL は、ドキュメント全体をクリアします。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。 実装の例については、MFC チュートリアルのサンプル「SCRIBBLE 」を参照してください。
ID_EDIT_COPY は、現在選択している部分をクリップボードにコピーします。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、このコマンドの実装を提供します。このコマンドは、現在選択されているテキストを、CEdit::Copy
を使用して CF_TEXT としてクリップボードにコピーします。 現在選択されていない場合、コマンドは無効になります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_CUT は、現在選択している部分をクリップボードにカットします。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、このコマンドの実装を提供します。このコマンドは、現在選択されているテキストを、CEdit::Cut
を使用して CF_TEXT としてクリップボードにカットします。 現在選択されていない場合、コマンドは無効になります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_FIND により、検索操作が開始され、モードレスの [検索] ダイアログが表示されます。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、このコマンドの実装を提供します。このコマンドは、前の検索/置換設定を使用してプライベート実装変数に格納するための実装ヘルパー関数OnEditFindReplace
を呼び出します。CFindReplaceDialog
クラスは、ユーザーにプロンプトを表示するためのモードレス ダイアログを管理するために使用されます。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_PASTE は、現在のクリップボードの内容を挿入します。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、このコマンドの実装を提供します。このコマンドは、CEdit::Paste
を使用して現在のクリップボード データと選択されたデータを置き換えます。 クリップボードに CF_TEXT がない場合、コマンドは無効になります。COleClientDoc
は、このコマンドの更新コマンド UI ハンドラーを提供するだけです。 クリップボードに埋め込み OLE 項目またはオブジェクトが含まれていない場合、コマンドは無効になります。 実際の貼り付けを行う実際のコマンドのハンドラーを記述する必要があります。 OLE アプリケーションで他の形式も貼り付けることができる場合は、独自の更新コマンド UI ハンドラーをビューまたはドキュメント (コマンドターゲット ルーティングのCOleClientDoc
の前の場所) に指定する必要があります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
標準の OLE 実装を置き換えるには、
COleClientItem::CanPaste
を使用します。ID_EDIT_PASTE_LINK は、現在のクリップボードの内容からリンクを挿入します。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。COleDocument
は、このコマンドの更新コマンド UI ハンドラーを提供するだけです。 クリップボードにリンクを設定できる OLE 項目またはオブジェクトが含まれていない場合、コマンドは無効になります。 実際の貼り付けを行う実際のコマンドのハンドラーを記述する必要があります。 OLE アプリケーションで他の形式も貼り付けることができる場合は、独自の更新コマンド UI ハンドラーをビューまたはドキュメント (コマンドターゲット ルーティングのCOleDocument
の前の場所) に指定する必要があります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
標準の OLE 実装を置き換えるには、
COleClientItem::CanPasteLink
を使用します。ID_EDIT_PASTE_SPECIAL は、オプションを使用して現在のクリップボードの内容を挿入します。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。 MFC では、このダイアログは提供されません。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_REPEAT は最後の操作を繰り返します。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、最後の検索操作を繰り返すために、このコマンドの実装を提供します。 最後の検索のためのプライベート実装変数が使用されます。 検索を実行できない場合、コマンドは無効になっています。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_REPLACE では、置換操作を開始すると、モードレス置換ダイアログが表示されます。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、このコマンドの実装を提供します。このコマンドは、前の検索/置換設定を使用してプライベート実装変数に格納するための実装ヘルパー関数OnEditFindReplace
を呼び出します。CFindReplaceDialog
クラスは、ユーザーにプロンプトを表示するためのモードレス ダイアログを管理するために使用されます。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_SELECT_ALL は、ドキュメント全体を選択します。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、ドキュメント内のすべてのテキストを選択する、このコマンドの実装を提供します。 テキストが選択されていない場合、コマンドは無効になります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_UNDO は、最後の操作を元に戻します。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。CEditView
は、CEdit::Undo
を使用して、このコマンドの実装を提供します。CEdit::CanUndo
が FALSE を返すと、コマンドは無効になります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_EDIT_REDO は、最後の操作をやり直します。
現在、このコマンドの標準実装はありません。 各
CView
派生クラスに対してこれを実装する必要があります。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_WINDOW_NEW は、作業中のドキュメントで別のウィンドウを開きます。
CMDIFrameWnd::OnWindowNew
は、現在のドキュメントのドキュメントテンプレートを使用して、現在のドキュメントの別のビューを含む別のフレームを作成することによって、この強力な機能を実装します。多くのマルチ ドキュメント インターフェイス (MDI) ウィンドウ メニュー コマンドと同様に、アクティブな MDI 子ウィンドウがないと、コマンドは無効になります。
このコマンドハンドラーのカスタマイズはお勧めしません。 追加のビューまたはフレーム ウィンドウを作成するコマンドを指定する場合は、独自のコマンドを作り出すことをお勧めします。
CMDIFrameWnd::OnWindowNew
からコードを複製し、自分リンクの特定のフレームおよびビュー クラスに変更できます。ID_WINDOW_ARRANGE は、MDI ウィンドウの下部にアイコンを整列します。
CMDIFrameWnd
は、この標準の MDI コマンドを実装ヘルパー関数OnMDIWindowCmd
で実装します。 このヘルパーは、コマンド ID を MDI Windows メッセージにマップするため、大量のコードを共有できます。多くの MDI ウィンドウ メニュー コマンドと同様に、アクティブな MDI 子ウィンドウがないと、コマンドは無効になります。
このコマンドハンドラーのカスタマイズはお勧めしません。
ID_WINDOW_CASCADE は、重なっているウィンドウを重ねます。
CMDIFrameWnd
は、この標準の MDI コマンドを実装ヘルパー関数OnMDIWindowCmd
で実装します。 このヘルパーは、コマンド ID を MDI Windows メッセージにマップするため、大量のコードを共有できます。多くの MDI ウィンドウ メニュー コマンドと同様に、アクティブな MDI 子ウィンドウがないと、コマンドは無効になります。
このコマンドハンドラーのカスタマイズはお勧めしません。
ID_WINDOW_TILE_HORZ は、ウィンドウを水平方向に並べます。
このコマンドは、ID_WINDOW_CASCADE と同様に
CMDIFrameWnd
で実装されます。ただし、操作には別の MDI Windows メッセージが使用されます。アプリケーションの既定のタイルの向きを選択する必要があります。 これを行うには、ウィンドウの [タイル] メニュー項目の ID を ID_WINDOW_TILE_HORZ または ID_WINDOW_TILE_VERT に変更します。
ID_WINDOW_TILE_VERT ウィンドウを垂直方向に並べます。
このコマンドは、ID_WINDOW_CASCADE と同様に
CMDIFrameWnd
で実装されます。ただし、操作には別の MDI Windows メッセージが使用されます。アプリケーションの既定のタイルの向きを選択する必要があります。 これを行うには、ウィンドウの [タイル] メニュー項目の ID を ID_WINDOW_TILE_HORZ または ID_WINDOW_TILE_VERT に変更します。
ID_WINDOW_SPLIT のキーボード インターフェイスをスプリッターにします。
CView
は、CSplitterWnd
実装に対してこのコマンドを処理します。 ビューがスプリッター ウィンドウの一部である場合、このコマンドは実装関数CSplitterWnd::DoKeyboardSplit
にデリゲートします。 これにより、キーボード ユーザーがスプリッター ウィンドウを分割または解除できるモードでスプリッターが配置されます。ビューがスプリッターに含まれていない場合、このコマンドは無効になります。
このコマンドハンドラーのカスタマイズはお勧めしません。
ID_APP_ABOUT は、[バージョン情報] ダイアログボックスを呼び出します。
アプリケーションの [バージョン情報] ボックスの標準実装はありません。 既定の AppWizard で作成したアプリケーションは、アプリケーションのカスタム ダイアログ クラスを作成し、[バージョン情報] ボックスとして使用します。 また、AppWizard は、このコマンドを処理してダイアログを呼び出す自明なコマンドハンドラーも記述します。
ほとんどの場合、このコマンドを実装します。
ID_APP_EXIT は、アプリケーションを終了します。
CWinApp::OnAppExit
は、アプリケーションのメイン ウィンドウに WM_CLOSE メッセージを送信することによって、このコマンドを処理します。 アプリケーションの標準のシャットダウン (ダーティファイルの要求など) は、CFrameWnd
実装によって処理されます。このコマンドハンドラーのカスタマイズはお勧めしません。
CWinApp::SaveAllModified
またはCFrameWnd
の終了ロジックをオーバーライドすることをお勧めします。このコマンドを実装する場合は、このコマンド ID を使用することをお勧めします。
ID_HELP_INDEX は、 .HLP ファイルヘルプトピックが一覧表示されます。
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。CWinApp::OnHelpIndex
は、CWinApp::WinHelp
を普通に呼び出してこのコマンドを処理します。このコマンドハンドラーのカスタマイズはお勧めしません。
ID_HELP_USING は、ヘルプの使用方法に関するヘルプが表示されます。
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。CWinApp::OnHelpUsing
は、CWinApp::WinHelp
を普通に呼び出してこのコマンドを処理します。このコマンドハンドラーのカスタマイズはお勧めしません。
ID_CONTEXT_HELP によって、SHIFT + F1 ヘルプモードに切り替わります。
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。CWinApp::OnContextHelp
は、ヘルプ モード カーソルを設定して、モーダル ループに入り、ユーザーがウィンドウを選択してヘルプを表示するまで待機することで、このコマンドを処理します。 MFC ヘルプの実装の詳細については、「テクニカルノート 28」を参照してください。このコマンドハンドラーのカスタマイズはお勧めしません。
ID_HELP は現在のコンテキストに関するヘルプを提供します
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。CWinApp::OnHelp
は、現在のアプリケーション コンテキストの適切なヘルプ コンテキストを取得することによって、このコマンドを処理します。 これにより、単純な F1 ヘルプ、メッセージ ボックスのヘルプなどが処理されます。 MFC ヘルプの実装の詳細については、「テクニカルノート 28」を参照してください。このコマンドハンドラーのカスタマイズはお勧めしません。
ID_DEFAULT_HELP は、コンテキストの既定のヘルプを表示します
Note
この機能を有効にするには、これを
CWinApp
派生クラスのメッセージ マップに接続する必要があります。このコマンドは通常、
CWinApp::OnHelpIndex
にマップされます。既定のヘルプとヘルプ インデックスの区別が必要な場合は、別のコマンド ハンドラーを指定できます。
ID_NEXT_PANE は次のペインに移動 します
CView
は、CSplitterWnd
実装に対してこのコマンドを処理します。 ビューがスプリッター ウィンドウの一部である場合、このコマンドは実装関数CSplitterWnd::OnNextPaneCmd
にデリゲートします。 これにより、アクティブなビューがスプリッターの次のペインに移動します。このコマンドは、ビューがスプリッターに含まれていない場合、または次のペインが表示されない場合には無効になります。
このコマンドハンドラーのカスタマイズはお勧めしません。
ID_PREV_PANE は前のペインに移動します
CView
は、CSplitterWnd
実装に対してこのコマンドを処理します。 ビューがスプリッター ウィンドウの一部である場合、このコマンドは実装関数CSplitterWnd::OnNextPaneCmd
にデリゲートします。 これにより、アクティブなビューがスプリッターの前のペインに移動します。このコマンドは、ビューがスプリッターに含まれていない場合、または前のペインがない場合は無効になります。
このコマンドハンドラーのカスタマイズはお勧めしません。
ID_OLE_INSERT_NEW は、新しい OLE オブジェクトを挿入します
現在、このコマンドの標準実装はありません。 を派生クラスに
CView
実装して、現在の選択範囲に新しい OLE 項目/オブジェクトを挿入する必要があります。すべての OLE クライアント アプリケーションは、このコマンドを実装する必要があります。 AppWizard を OLE オプションと共に使用すると、完了する必要のある
OnInsertObject
のスケルトン実装がビュークラスに作成されます。このコマンドの完全な実装については、MFC OLE サンプル OCLIENT の例を参照してください。
ID_OLE_EDIT_LINKS は OLE リンクを編集します
COleDocument
は、MFC に用意されている標準の OLE リンク ダイアログの実装を使用して、このコマンドを処理します。 このダイアログの実装には、COleLinksDialog
クラスを使用してアクセスします。 現在のドキュメントにリンクが含まれていない場合、コマンドは無効になります。このコマンドハンドラーのカスタマイズはお勧めしません。
ID_OLE_VERB_FIRST...LAST は、OLE Verb の ID 範囲です
COleDocument
は、現在選択されている OLE 項目またはオブジェクトでサポートされている Verb に対して、このコマンド ID 範囲を使用します。 指定された OLE 項目またはオブジェクトの型が、0 個以上のカスタム Verb をサポートできるため、これは範囲である必要があります。 アプリケーションのメニューには、ID_OLE_VERB_FIRST の ID を持つメニュー項目が 1 つ必要です。 プログラムを実行すると、メニューは適切なメニュー Verb の説明 (または Verb の多いポップアップメニュー) で更新されます。 OLE メニューの管理は、このコマンドの更新コマンド UI ハンドラーで実行したAfxOleSetEditMenu
によって処理されます。この範囲のコマンド ID を処理するための明示的なコマンド ハンドラーはありません。
COleDocument::OnCmdMsg
は、この範囲内のすべてのコマンド ID をトラップして、0 から始まる Verb 番号に変換し、その Verb のサーバーを起動します (COleClientItem::DoVerb
を使用)。このコマンド ID 範囲のカスタマイズまたはその他の使用は推奨されていません。
ID_VIEW_TOOLBAR は、ツールバーのオン/オフを切り替えます
CFrameWnd
は、このコマンドと、ツールバーの表示状態を切り替えるための更新コマンド UI ハンドラーを処理します。 ツールバーは、AFX_IDW_TOOLBAR の子ウィンドウ ID を持つフレームの子ウィンドウである必要があります。 コマンド ハンドラーは、実際には、ツールバー ウィンドウの表示を切り替えます。CFrameWnd::RecalcLayout
は、新しい状態のツールバーを使用してフレーム ウィンドウを再描画するために使用されます。 ツールバーが表示されている場合、更新コマンドの UI ハンドラーによってメニュー項目がチェックされます。このコマンドハンドラーのカスタマイズはお勧めしません。 他のツールバーを追加する場合は、このコマンドのコマンド ハンドラーと更新コマンド UI ハンドラーを複製して変更する必要があります。
ID_VIEW_STATUS_BAR は、ステータスバーのオンとオフを切り替えます
このコマンドは、ID_VIEW_TOOLBAR と同様に、異なる子ウィンドウ ID (AFX_IDW_STATUS_BAR) が使用される点を除いて、
CFrameWnd
に実装されています。
更新専用のコマンドハンドラー
いくつかの標準コマンド ID は、ステータス バーでインジケーターとして使用されます。 これらは、同じ更新コマンド UI 処理機構を使用して、アプリケーションのアイドル時間中に現在のビジュアル状態を表示します。 ユーザーが選択することはできないため (ステータス バー ペインをプッシュすることはできません)、これらのコマンド ID に ON_COMMAND ハンドラーを設定することは意味がありません。
ID_INDICATOR_CAPS: CAP ロック インジケーター。
ID_INDICATOR_NUM : NUM ロック インジケーター。
ID_INDICATOR_SCRL : SCRL ロック インジケーター。
ID_INDICATOR_KANA: かなロック インジケーター (日本語システムのみに適用)。
これら 3 つはすべて、コマンド ID を使用して適切な仮想キーにマップする実装ヘルパーである CFrameWnd::OnUpdateKeyIndicator
で実装されています。 共通の実装では、適切な仮想キーが現在ロックされているかどうかに応じて、CCmdUI
オブジェクトを有効または無効にします (ステータス ペインが無効になっている、つまりテキストがない場合)。
このコマンドハンドラーのカスタマイズはお勧めしません。
ID_INDICATOR_EXT: 拡張選択インジケーター。
ID_INDICATOR_OVR: 上書きインジケーター。
ID_INDICATOR_REC : 記録インジケーター。
現在、このインジケーターの標準実装はありません。
これらのインジケーターを実装することを選択した場合は、これらのインジケーター ID を使用して、ステータス バーのインジケーターの順序 (つまり、EXT、CAP、NUM、SCRL、OVR、REC) を維持することをお勧めします。