テクニカル ノート 22: 標準コマンドの実装
更新 : 2007 年 11 月
メモ : |
---|
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。 |
このノートでは、MFC 2.0 により提供される標準的なコマンドの実装について説明します。「テクニカル ノート 21: コマンドとメッセージのルーティング」を読んで、標準コマンドを実装するための機構についてあらかじめ理解しておいてください。
以下の説明は、MFC アーキテクチャ、API、一般的なプログラミングに関する知識を前提としています。非公式な "実装専用" API や公式の API についても説明しますが、MFC の機能やそのプログラミングの方法については解説しません。より一般的な情報および公式の API の詳細については、Visual C++ のドキュメントを参照してください。
問題
MFC では、多くの標準コマンド ID をヘッダー ファイル AFXRES.H で定義しています。フレームワークによるこれらのコマンドの処理方法はさまざまです。フレームワーク クラスがこれらのコマンドをどこで、どのように処理するかを理解しておくと、フレームワークが内部的にどのように動作するかがわかります。さらに、標準実装をカスタマイズするための情報や、独自のコマンド ハンドラを実装するためのテクニックも得ることができます。
このテクニカル ノートの内容
それぞれのコマンド ID について 2 つのセクションに分けて説明します。
タイトル。コマンド ID のシンボル名です (ID_FILE_SAVE など)。その後に、コロンで区切ってコマンドの機能を説明します ("現在の文書の保存" など)。
その後のパラグラフでは、そのコマンドを実装するクラスと、その既定の動作を説明します。
既定のコマンドのほとんどの実装はフレームワークの基本クラスのメッセージ マップに既に結び付けられていますが、実装を派生クラスに対して明示的に結び付ける必要があるコマンドもあります。これらのコマンドは「メモ」に説明されています。AppWizard で正しいオプションを選択すると、これらの既定のハンドラが生成されたスケルトン アプリケーションに正しく結合されます。
名前付け規約
標準コマンドは、単純な名前付け規約に従っています。できる限りこの規約に従ってください。ほとんどの標準コマンドは、アプリケーションのメニュー バーの標準の位置に置かれます。コマンドのシンボル名は "ID_" で始まり、標準のポップアップ メニュー名とメニュー項目名が続きます。シンボル名は英大文字で単語の切れ目に下線 (_) が挿入されます。標準メニュー項目名を持たないコマンドでは、"ID_" で始まる論理名 (たとえば ID_NEXT_PANE) が定義されます。
プリフィックス "ID_" は、メニュー項目やツール バー ボタンなどのコマンド ユーザー インターフェイス オブジェクトに結び付けられるコマンドを表します。"ID_" コマンドを処理するコマンド ハンドラは、MFC コマンド アーキテクチャの ON_COMMAND 機構や ON_UPDATE_COMMAND_UI 機構を使ってください。
コマンド アーキテクチャに従わず、メニュー固有のコードを使ってオンオフを行うメニュー項目には、標準プリフィックス "IDM_" を使うことをお勧めします。しかし、メニュー固有のコマンドはできるだけ使わないようにしてください。MFC コマンド アーキテクチャに従うと、より強力なコマンド ハンドラを作成できる (ツール バーで動作させることができます) だけでなく、コマンド ハンドラを再利用できるからです。
ID の範囲
MFC における ID 値の範囲の詳細については、「テクニカル ノート 20: ID 名および番号に関する規約」を参照してください。
MFC 標準コマンドは 0xE000 から 0xEFFF の範囲になります。これらの ID の値はライブラリの将来のバージョンで変更される可能性があるので、現在のバージョンの特定の値に依存しないでください。
アプリケーションでは、0x8000 から 0xDFFF の範囲でコマンドを定義してください。
標準コマンド ID
ファイル PROMPTS.RC に、それぞれのコマンド ID に対する標準のメッセージ行プロンプトが記述されています。メニュー プロンプトの文字列 ID は、必ずコマンド ID と同じにします。
ID_FILE_NEW 新しい空の文書を作成します。
メモ : この機能を有効にするには、CWinApp 派生クラスのメッセージ マップにこれを結合します。
CWinApp::OnFileNew メンバ関数は、アプリケーション内のドキュメント テンプレートの数に応じて処理を行います。CDocTemplate が 1 つしかない場合は、その型の新しい文書と、該当するフレームおよびビュー クラスを作成します。
複数の CDocTemplate がある場合は、どの型の文書を作成するか、ダイアログ ボックス (AFX_IDD_NEWTYPEDLG) を表示してユーザーに問い合わせます。選択された CDocTemplate 型の文書が作成されます。
ID_FILE_NEW コマンドの一般的なカスタマイズは、文書の型をグラフィカルに選択させるためのものです。この場合には CMyApp::OnFileNew 関数を実装して CWinApp::OnFileNew の代わりに、メッセージ マップに登録します。基本クラスの実装を呼び出す必要はありません。
別のカスタマイズの方法として、文書の型ごとに別のコマンドを提供するというものがあります。この場合は、新しいコマンド ID (ID_FILE_NEW_CHART、ID_FILE_NEW_SHEET など) を定義します。
ID_FILE_OPEN 既存の文書を開きます。
メモ : この機能を有効にするには、CWinApp 派生クラスのメッセージ マップにこれを結合します。
CWinApp::OnFileOpen は、CWinApp::DoPromptFileName を呼び出してから、開くファイルの名前またはパス名をパラメータとして CWinApp::OpenDocumentFile を呼び出すだけです。CWinApp の DoPromptFileName メンバ関数は、標準の FileOpen ダイアログを呼び出し、現在のドキュメント テンプレートから得たファイル拡張子を表示します。
ID_FILE_OPEN コマンドの一般的なカスタマイズでは、[開く] ダイアログ ボックスをカスタマイズするか、ファイル フィルタを追加します。お勧めするカスタマイズ方法は、既定の実装を独自の [開く] ダイアログ ボックスに置き換え、CWinApp::OpenDocumentFile メンバ関数を文書のファイル名またはパス名をパラメータとして呼び出す、というものです。基本クラスの実装を呼び出す必要はありません。
ID_FILE_CLOSE 現在開いている文書を閉じます。
CDocument::OnFileClose メンバ関数は、文書が変更されていると、CDocument::SaveModified メンバ関数を呼び出してユーザーに保存するかどうを問い合わせます。その後で、OnCloseDocument 関数を呼び出します。文書の破棄を含む、すべてのクローズ動作は OnCloseDocument ルーチンが行います。
メモ : ID_FILE_CLOSE の動作は、WM_CLOSE メッセージとも、ドキュメントのフレーム ウィンドウに送られる SC_CLOSE システム コマンド メッセージとも違います。ウィンドウを閉じると、そのウィンドウ以外に同じ文書を表示しているフレーム ウィンドウがない場合は、表示されている文書も閉じます。ID_FILE_CLOSE で文書を閉じると、文書が閉じられるだけでなく、その文書を表示しているすべてのフレーム ウィンドウも閉じられます。
ID_FILE_SAVE 現在の文書を保存します。
このコマンドでは、OnFileSave メンバ関数と OnFileSaveAs メンバ関数の両方にヘルパー ルーチン CDocument::DoSave を使います。以前に保存されたことがない文書 (FileNew された文書のようにパス名を持っていない文書) を保存する場合や、読み取り専用文書から読み込んだ文書を保存すると、OnFileSave メンバ関数が ID_FILE_SAVE_AS コマンドのように動作し、ユーザーに新しいファイル名を問い合わせます。ファイルのオープンから保存までの実際のプロセスは、仮想関数 OnSaveDocument が処理します。
主に 2 つの理由から ID_FILE_SAVE コマンドをカスタマイズします。まず、保存しない文書に対しては、ID_FILE_SAVE メニュー項目とツール バー ボタンをユーザー インターフェイスから取り除きます。文書が変更されていない (CDocument::SetModifiedFlag メンバ関数が呼ばれていない) 場合には、フレームワークはその文書を保存しません。また、ディスク ファイル以外の場所に保存されるドキュメントについては、保存のための新しいコマンドを定義する必要があります。
COleServerDoc の場合、ID_FILE_SAVE コマンドは、ファイル保存 (通常のドキュメント) とファイル更新 (埋め込みドキュメント) の両方に使われます。
文書データを単一のディスク ファイルに格納するときに、CDocument の既定のシリアル化機能を使いたくない場合は、OnFileSave メンバ関数ではなく CDocument::OnSaveDocument メンバ関数をオーバーライドします。
ID_FILE_SAVE_AS 現在の文書を違う名前で保存します。
CDocument::OnFileSaveAs メンバ関数の実装では、OnFileSave コマンドと同じように CDocument::DoSave ヘルパー関数が使われます。保存する文書にファイル名がない場合は、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 オブジェクトを生成し、該当するプリンタ属性 (通常は、hDevMode と hDevNames) で初期化し、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 機構の上級利用者向けの更新コマンド UI ハンドラです。メニュー リソースでは、ID として ID_FILE_MRU_FILE1 を持つメニュー項目を 1 つだけ定義します。このメニュー項目は初期状態では使えないようになっています。
MRU リストが大きくなると、さらにメニュー項目がリストに追加されます。CWinApp クラスの標準の実装では、既定では最近使ったファイルが 4 つまで表示されます。この既定の設定を変更するには、CWinApp::LoadStdProfileSettings メンバ関数に 4 以外の値を渡します。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 サンプル : MFC MDI 描画アプリケーション」を参照してください。
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 オブジェクトが入っていない場合は、このコマンドを使えません。実際に貼り付けを行うコマンドのハンドラは自分で作成してください。OLE アプリケーションがほかのフォーマットでも貼り付けを行うことができる場合は、自分のビューまたはドキュメントに (つまり、コマンド ターゲットのルーティング (振り分け) で COleClientDoc の前のどこかに) 独自の更新コマンド UI ハンドラを用意する必要があります。
このコマンドを実装する場合は、コマンド ID をそのまま使うことをお勧めします。
OLE の標準実装を置き換えるには、COleClientItem::CanPaste メンバ関数を使ってください。
ID_EDIT_PASTE_LINK 現在のクリップボード内容からのリンクを挿入します。
現在、このコマンドの標準の実装はありません。CView の派生クラスごとに実装してください。
COleDocument が、このコマンドの更新コマンド UI ハンドラを提供します。クリップボードに埋め込み可能な OLE アイテムや OLE オブジェクトが入っていないと、このコマンドは使えません。実際に貼り付けを行うコマンドのハンドラは自分で作成してください。OLE アプリケーションがほかのフォーマットでも貼り付けを行うことができる場合は、ビューまたはドキュメントに (つまり、コマンド ターゲットのルーティングで COleDocument の前のどこかに)、独自の更新コマンド UI ハンドラを用意する必要があります。
このコマンドを実装する場合は、コマンド 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 ウィンドウの下部にアイコンを整列させます。
この標準 MDI コマンドは CMDIFrameWnd のヘルパー関数 OnMDIWindowCmd で実装します。このヘルパー関数は、コマンド ID を MDI Windows メッセージに対応付けるため、多くのコードを共有できます。
アクティブな MDI 子ウィンドウがない場合は、MDI の [ウィンドウ] メニューのほとんどのコマンドと同様、このコマンドは使えません。
このコマンド ハンドラのカスタマイズはお勧めしません。
ID_WINDOW_CASCADE ウィンドウを重ねて表示します。
この標準 MDI コマンドは CMDIFrameWnd のヘルパー関数 OnMDIWindowCmd で実装します。このヘルパー関数は、コマンド ID を MDI Windows メッセージに対応付けるため、多くのコードを共有できます。
アクティブな MDI 子ウィンドウがない場合は、MDI の [ウィンドウ] メニューのほとんどのコマンドと同様、このコマンドは使えません。
このコマンド ハンドラのカスタマイズはお勧めしません。
ID_WINDOW_TILE_HORZ ウィンドウを水平方向に並べて表示します。
このコマンドは、方向によって異なる Windows メッセージが使われることを除くと、ID_WINDOW_CASCADE と同じように CMDIFrameWnd で実装されます。
アプリケーションの既定の整列方向を選択してください。これは、[ウィンドウ] メニューの [並べて表示] メニュー項目の ID を ID_WINDOW_TILE_HORZ または ID_WINDOW_TILE_VERT のどちらかに変更することによって行うことができます。
ID_WINDOW_TILE_VERT ウィンドウを垂直方向に並べて表示します。
このコマンドは、方向によって異なる Windows メッセージが使われることを除くと、ID_WINDOW_CASCADE と同じように CMDIFrameWnd で実装されます。
アプリケーションの既定の整列方向を選択してください。これは、[ウィンドウ] メニューの [並べて表示] メニュー項目の 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 サンプル』の「OCLIENT サンプル : ビジュアル編集コンテナ アプリケーションの説明」を参照してください。
ID_OLE_EDIT_LINKS OLE リンクを編集します。
COleDocument は、MFC の提供する標準 OLE リンク ダイアログ ボックスを使って、このコマンドを処理します。このダイアログ ボックスには、COleLinksDialog クラスを使ってアクセスします。現在のドキュメントにリンクがないときは、このコマンドは使えません。
このコマンド ハンドラのカスタマイズはお勧めしません。
ID_OLE_VERB_FIRST...LAST OLE の動詞の ID。
COleDocument は、現在選択されている OLE アイテム/オブジェクトがサポートする動詞に対して、この ID 範囲のコマンドを使います。この範囲は、所定の OLE アイテム/オブジェクトがサポートしているカスタム動詞の個数と等しくしてください。アプリケーションのメニューには、ID_OLE_VERB_FIRST の ID を持つメニュー項目を 1 つ用意してください。プログラムが実行されると、このメニュー項目は、該当するメニューに対する動詞の記述 (または、複数の動詞を含んだポップアップ メニュー) で更新されます。OLE メニューの管理は、AfxOleSetEditMenu で処理され、このコマンドの更新コマンド UI ハンドラで実行されます。この ID 範囲の各コマンドは、異なるコマンド ハンドラで処理されるわけではありません。
COleDocument::OnCmdMsg メンバ関数をオーバーライドして、この範囲内のすべてのコマンド ID をトラップします。トラップされたコマンド ID は、ゼロから始まる動詞番号に変換され、その動詞に対するサーバーが (COleClientItem::DoVerb を使って) 起動されます。
このコマンド ID 範囲のカスタマイズや別の使い方はお勧めしません。
ID_VIEW_TOOLBAR ツール バーのオン/オフを切り替えます。
CFrameWnd がこのコマンドを処理し、更新コマンド UI ハンドラがツール バーの状態 (表示/非表示) を切り替えます。ツール バーは、フレームの子ウィンドウにする必要があります (ID は AFX_IDW_TOOLBAR)。このコマンド ハンドラが、ツール バー ウィンドウの表示状態を実際に切り替えます。CFrameWnd::RecalcLayout ではフレーム ウィンドウを再描画して、ツール バーの状態を更新します。ツール バーが表示されているときは、更新コマンド UI ハンドラがメニュー項目を調べます。
このコマンド ハンドラのカスタマイズはお勧めしません。ツール バーを追加するには、このコマンド ハンドラとこのコマンドの更新コマンド UI ハンドラの複製 (クローン) を作って修正を行ってください。
ID_VIEW_STATUS_BAR ステータス バーのオン/オフを切り替えます。
このコマンドは、別の子ウィンドウ ID (AFX_IDW_STATUS_BAR) が使われていること以外は、ID_VIEW_TOOLBAR と同じように CFrameWnd で実装されています。
更新専用のコマンド ハンドラ
ステータス バーのインジケータとして使われる標準コマンド ID があります。これらのコマンドは、アプリケーションが入力待ち状態のときに、同じ更新コマンド UI 処理機構を使って、現在の状態を表示します。これらのコマンドはユーザーが選択できないので (ステータス バーのペインをプッシュできないので)、これらのコマンド ID の ON_COMMAND ハンドラは不要です。
ID_INDICATOR_CAPS : [CAP lock] インジケータ
ID_INDICATOR_NUM : [NUM lock] インジケータ
ID_INDICATOR_SCRL : [SCRL lock] インジケータ
ID_INDICATOR_KANA : [KANA lock] インジケータ (日本語システムに限ります)
この 4 つはすべて、CFrameWnd::OnUpdateKeyIndicator で実装されます。このヘルパー関数は、コマンド ID を該当する仮想キーに対応付けるために使います。一般的な実装では、仮想キーがロックされているかどうかに応じて、CCmdUI オブジェクトを有効または無効にします。ステータス ペインが無効のときは、何もテキストを表示しません。
このコマンド ハンドラのカスタマイズはお勧めしません。
ID_INDICATOR_EXT : [EXT] 拡張選択インジケータ
ID_INDICATOR_OVR : [OVR] 抹消インジケータ
ID_INDICATOR_REC : [REC] 登録インジケータ
現在のところ、これらのインジケータの標準の実装はありません。
これらのインジケータを実装する場合は、上の ID を使い、ステータス バー上のインジケータを (EXT、CAP、NUM、SCRL、OVR、REC) の順にすることをお勧めします。