次の方法で共有


TN022: 標準コマンドの実装

次のテクニカル ノートは、最初にオンライン ドキュメントに含まれてから更新されていません。 その結果、一部の手順やトピックが古くなっているか、正しくない可能性があります。 最新情報については、オンライン ドキュメント インデックスで関心のあるトピックを検索することをお勧めします。

このノートでは、MFC 2.0 で提供される標準のコマンド実装について説明します。 最初 にテクニカル ノート 21 をお読みください。標準コマンドの多くを実装するために使用されるメカニズムについて説明しています。

この説明では、MFC アーキテクチャ、API、および一般的なプログラミングプラクティスに関する知識を前提としています。 文書化されているだけでなく、文書化されていない "実装のみ" API についても説明します。 これは、MFC の機能やプログラミング方法について学習を始める場所ではありません。 一般的な情報と文書化されている API の詳細については、Visual C++ を参照してください。

問題

MFC は、ヘッダー ファイル AFXRES.H に多くの標準コマンド ID を定義します。 これらのコマンドのフレームワークのサポートは異なります。 フレームワーク クラスがこれらのコマンドを処理する場所と方法を理解すると、フレームワークの内部的な動作を示すだけでなく、標準実装をカスタマイズし、独自のコマンド ハンドラーを実装するためのいくつかの手法について説明する方法に関する有用な情報が提供されます。

このテクニカル ノートの内容

各コマンド ID については、次の 2 つのセクションで説明します。

  • タイトル: コマンド ID のシンボリック名 (たとえば、ID_FILE_SAVE) の後に、コロンで区切られたコマンドの目的 ("現在のドキュメントを保存" など) が続きます。

  • コマンドを実装するクラスと、既定の実装で実行される内容を説明する 1 つ以上の段落

ほとんどの既定のコマンド実装は、フレームワークの基本クラス メッセージ マップに事前に接続されています。 派生クラスには、明示的な配線を必要とするコマンド実装がいくつかあります。 これらは「注」の下で説明されています。 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 は、ライブラリの将来のバージョンで変更される可能性があるため、これらの ID の特定の値に依存しないでください。

アプリケーションでは、コマンドを0x8000から0xDFFFの範囲内で定義する必要があります。

標準コマンドID

コマンド ID ごとに、ファイル PROMPTS.RC に含まれる標準のメッセージ行プロンプト文字列があります。 そのメニュー プロンプトの文字列 ID は、コマンド ID と同じである必要があります。

  • ID_FILE_NEW 新しいドキュメントまたは空のドキュメントを作成します。

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    CWinApp::OnFileNew では、アプリケーション内のドキュメント テンプレートの数に応じて、このコマンドの実装方法が異なります。 CDocTemplateが 1 つしかない場合、CWinApp::OnFileNewはその種類の新しいドキュメントと、適切なフレームおよびビュー クラスを作成します。

    複数の CDocTemplateがある場合、 CWinApp::OnFileNew は、使用するドキュメントの種類を選択できるようにするダイアログ (AFX_IDD_NEWTYPEDLG) をユーザーに求めるメッセージを表示します。 選択した CDocTemplate を使用してドキュメントを作成します。

    ID_FILE_NEWの一般的なカスタマイズの 1 つは、ドキュメントの種類の異なる、よりグラフィカルな選択を提供することです。 この場合は、独自の CMyApp::OnFileNew を実装し、 CWinApp::OnFileNewの代わりにメッセージ マップに配置できます。 基底クラスの実装を呼び出す必要はありません。

    ID_FILE_NEWのもう 1 つの一般的なカスタマイズは、各種類のドキュメントを作成するための個別のコマンドを提供することです。 この場合は、ID_FILE_NEW_CHARTやID_FILE_NEW_SHEETなど、新しいコマンド ID を定義する必要があります。

  • ID_FILE_OPEN 既存のドキュメントを開きます。

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    CWinApp::OnFileOpen には、 CWinApp::DoPromptFileName を呼び出す非常に単純な実装があり、その後に開くファイルのファイル名またはパス名を持つ CWinApp::OpenDocumentFile が続きます。 CWinApp実装ルーチンDoPromptFileNameは、標準の FileOpen ダイアログを表示し、現在のドキュメント テンプレートから取得したファイル拡張子を入力します。

    ID_FILE_OPENの一般的なカスタマイズの 1 つは、[FileOpen] ダイアログをカスタマイズするか、ファイル フィルターを追加することです。 これをカスタマイズする推奨される方法は、既定の実装を独自の FileOpen ダイアログに置き換え、 CWinApp::OpenDocumentFile をドキュメントのファイル名またはパス名で呼び出す方法です。 基底クラスを呼び出す必要はありません。

  • ID_FILE_CLOSE 現在開いているドキュメントを閉じます。

    CDocument::OnFileCloseCDocument::SaveModified を呼び出して、ドキュメントが変更された場合にドキュメントを保存するように求め、 OnCloseDocumentを呼び出します。 ドキュメントの破棄を含むすべての終了ロジックは、 OnCloseDocument ルーチンで実行されます。

    ID_FILE_CLOSEは、ドキュメント フレーム ウィンドウに送信されたWM_CLOSE メッセージやSC_CLOSE システム コマンドとは異なる動作をします。 ウィンドウを閉じると、ドキュメントが表示されている最後のフレーム ウィンドウである場合にのみ、ドキュメントが閉じます。 ID_FILE_CLOSEでドキュメントを閉じると、ドキュメントが閉じるだけでなく、ドキュメントを表示するすべてのフレーム ウィンドウが閉じます。

  • ID_FILE_SAVE 現在の文書を保存します。

    実装では、CDocument::DoSaveOnFileSaveの両方に使用されるヘルパー ルーチン OnFileSaveAsを使用します。 以前に保存されていないドキュメント (つまり、FileNew の場合と同様にパス名を持たない) または読み取り専用ドキュメントから読み取られたドキュメントを保存した場合、 OnFileSave ロジックは ID_FILE_SAVE_AS コマンドのように動作し、ユーザーに新しいファイル名を指定するように求めます。 ファイルを開いて保存する実際のプロセスは、仮想関数 OnSaveDocumentによって行われます。

    ID_FILE_SAVEをカスタマイズするには、2 つの一般的な理由があります。 保存しないドキュメントの場合は、ID_FILE_SAVEメニュー項目とツール バー ボタンをユーザー インターフェイスから削除するだけです。 また、ドキュメントを汚さないことを確認します (つまり、 CDocument::SetModifiedFlagを呼び出すことはありません)、フレームワークによってドキュメントが保存されることはありません。 ディスク ファイル以外の場所に保存するドキュメントの場合は、その操作の新しいコマンドを定義します。

    COleServerDocの場合、ID_FILE_SAVEはファイルの保存 (通常のドキュメントの場合) とファイルの更新 (埋め込みドキュメントの場合) の両方に使用されます。

    ドキュメント データが個々のディスク ファイルに格納されていても、既定のCDocumentシリアル化実装を使用しない場合は、CDocument::OnSaveDocumentの代わりにOnFileSaveをオーバーライドする必要があります。

  • 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標準の [印刷設定] ダイアログを呼び出します。

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    このコマンドは、標準の印刷設定ダイアログを呼び出します。これにより、ユーザーは、少なくともこのドキュメントまたはこのアプリケーション内のすべてのドキュメントのプリンターと印刷設定をカスタマイズできます。 コントロール パネルを使用して、システム全体の既定のプリンター設定を変更する必要があります。

    CWinApp::OnFilePrintSetup には、 CPrintDialog オブジェクトを作成し、 CWinApp::DoPrintDialog 実装関数を呼び出す非常に単純な実装があります。 これにより、アプリケーションの既定のプリンターセットアップが設定されます。

    このコマンドをカスタマイズする一般的なニーズは、ドキュメントごとのプリンター設定を許可することです。この設定は、保存時にドキュメントと共に保存する必要があります。 これを行うには、CDocument オブジェクトを作成するメッセージ マップ ハンドラーを CPrintDialog クラスに追加し、適切なプリンター属性 (通常は hDevModehDevNames) を使用して初期化し、CPrintDialog::DoModalを呼び出して、変更されたプリンター設定を保存する必要があります。 堅牢な実装を行うには、エラーを検出するためのCWinApp::DoPrintDialogの実装を調べ、適切な既定値に対処し、システム全体のプリンターの変更を追跡するためのCWinApp::UpdatePrinterSelectionを確認する必要があります。

  • ID_FILE_PRINT現在の文書の標準印刷

    この機能を有効にするには、これを 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現在の文書の印刷プレビュー モードに切り替えます。

    この機能を有効にするには、これを 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 ファイルに格納されています。 リストは、InitInstanceを呼び出すとアプリケーションのLoadStdProfileSettings関数に読み込まれ、アプリケーションの終了時に保存されます。 また、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 は、実装ヘルパー関数 OnMDIWindowCmdにこの標準 MDI コマンドを実装します。 このヘルパーは、コマンド ID を MDI Windows メッセージにマップするため、多くのコードを共有できます。

    ほとんどの MDI ウィンドウ メニュー コマンドと同様に、アクティブな MDI 子ウィンドウがない場合、コマンドは無効になります。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_WINDOW_CASCADE重なるようにウィンドウをカスケードします。

    CMDIFrameWnd は、実装ヘルパー関数 OnMDIWindowCmdにこの標準 MDI コマンドを実装します。 このヘルパーは、コマンド 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ファイルからヘルプトピックを一覧表示します。

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    CWinApp::OnHelpIndex は、 CWinApp::WinHelpを簡単に呼び出すことによって、このコマンドを処理します。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_HELP_USING ヘルプの使用方法に関するヘルプが表示されます。

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    CWinApp::OnHelpUsing は、 CWinApp::WinHelpを簡単に呼び出すことによって、このコマンドを処理します。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_CONTEXT_HELP によって、SHIFT + F1 ヘルプモードに切り替わります。

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    CWinApp::OnContextHelp は、ヘルプ モード カーソルを設定し、モーダル ループに入り、ユーザーがヘルプを取得するウィンドウを選択するのを待機することで、このコマンドを処理します。 MFC ヘルプの実装の詳細については、 テクニカル ノート 28 を参照してください。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_HELP 現在のコンテキストに関するヘルプを提供します

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    CWinApp::OnHelp は、現在のアプリケーション コンテキストの適切なヘルプ コンテキストを取得することで、このコマンドを処理します。 これにより、単純な F1 ヘルプ、メッセージ ボックスのヘルプなどが処理されます。 MFC ヘルプの実装の詳細については、 テクニカル ノート 28 を参照してください。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_DEFAULT_HELP コンテキストの既定のヘルプを表示します。

    この機能を有効にするには、これを CWinApp派生クラスのメッセージ マップに接続する必要があります。

    このコマンドは通常、 CWinApp::OnHelpIndexにマップされます。

    既定のヘルプとヘルプ インデックスの区別が必要な場合は、別のコマンド ハンドラーを指定できます。

  • ID_NEXT_PANE次のウィンドウに移動

    CView は、 CSplitterWnd 実装に対してこのコマンドを処理します。 ビューが分割ウィンドウの一部である場合、このコマンドは実装関数 CSplitterWnd::OnNextPaneCmdに委任します。 これにより、アクティブなビューがスプリッターの次のペインに移動します。

    ビューがスプリッターにない場合、または次に移動するウィンドウがない場合、このコマンドは無効になります。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_PREV_PANE前のウィンドウに移動

    CView は、 CSplitterWnd 実装に対してこのコマンドを処理します。 ビューが分割ウィンドウの一部である場合、このコマンドは実装関数 CSplitterWnd::OnNextPaneCmdに委任します。 これにより、アクティブなビューがスプリッターの前のペインに移動します。

    ビューがスプリッターにない場合、または以前に移動するペインがない場合、このコマンドは無効になります。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_OLE_INSERT_NEW 新しい OLE オブジェクトを挿入します。

    現在、このコマンドの標準的な実装はありません。 現在の選択範囲に新しい OLE 項目/オブジェクトを挿入するには、 CView派生クラスに対してこれを実装する必要があります。

    すべての OLE クライアント アプリケーションでこのコマンドを実装する必要があります。 APPWizard は OLE オプションを使用して、完了する必要があるビュー クラスに OnInsertObject のスケルトン実装を作成します。

    このコマンドの完全な実装については、MFC OLE サンプル OCLIENT の例を参照してください。

  • ID_OLE_EDIT_LINKS OLE リンクを編集する

    COleDocument は、標準の OLE リンク ダイアログの MFC 提供の実装を使用して、このコマンドを処理します。 このダイアログの実装は、 COleLinksDialog クラスを介してアクセスされます。 現在のドキュメントにリンクが含まれていない場合、コマンドは無効になります。

    このコマンド ハンドラーのカスタマイズは推奨されません。

  • ID_OLE_VERB_FIRST...LAST は、OLE Verb の ID 範囲です

    COleDocument は、現在選択されている OLE 項目/オブジェクトでサポートされている動詞に対して、このコマンド ID 範囲を使用します。 特定の OLE 項目/オブジェクト型で 0 個以上のカスタム動詞をサポートできるため、この範囲を指定する必要があります。 アプリケーションのメニューには、ID_OLE_VERB_FIRSTの ID を持つメニュー項目が 1 つ必要です。 プログラムを実行すると、メニューが適切なメニュー動詞の説明 (または多くの動詞を含むポップアップ メニュー) で更新されます。 OLE メニューの管理は、このコマンドの更新コマンド UI ハンドラーで実行される AfxOleSetEditMenuによって処理されます。

    この範囲内の各コマンド ID を処理するための明示的なコマンド ハンドラーはありません。 COleDocument::OnCmdMsg はオーバーライドされ、この範囲内のすべてのコマンド ID をトラップし、0 から始まる動詞番号に変換し、その動詞のサーバーを起動します ( COleClientItem::DoVerbを使用)。

    このコマンド ID 範囲のカスタマイズまたはその他の使用は推奨されません。

  • ID_VIEW_TOOLBAR ツールバーのオンとオフを切り替えます。

    CFrameWnd は、このコマンドと update-command UI ハンドラーを処理して、ツール バーの表示状態を切り替えます。 ツールバーは、AFX_IDW_TOOLBARの子ウィンドウ ID を持つフレームの子ウィンドウである必要があります。 コマンド ハンドラーは、実際にはツール バー ウィンドウの表示/非表示を切り替えます。 CFrameWnd::RecalcLayout は、ツールバーが新しい状態でフレーム ウィンドウを再描画するために使用されます。 更新コマンド UI ハンドラーは、ツール バーが表示されているときにメニュー項目を確認します。

    このコマンド ハンドラーのカスタマイズは推奨されません。 追加のツール バーを追加する場合は、このコマンドのコマンド ハンドラーと update-command UI ハンドラーを複製して変更します。

  • ID_VIEW_STATUS_BAR ステータス バーのオンとオフを切り替えます。

    このコマンドは、別の子ウィンドウ ID (AFX_IDW_STATUS_BAR) が使用される点を除き、ID_VIEW_TOOLBARと同様に 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 : OVeRstrike インジケーター。

  • ID_INDICATOR_REC : 録音インジケーター。

現時点では、これらのインジケーターの標準的な実装はありません。

これらのインジケーターを実装する場合は、これらのインジケーター ID を使用し、ステータス バーのインジケーターの順序を維持することをお勧めします (つまり、EXT、CAP、NUM、SCRL、OVR、REC)。

こちらも参照ください

番号別テクニカル ノート
カテゴリ別テクニカル ノート