名前を付けて保存・・・。区切り線を入れて、アプリケーションの終了・・・。最後にIDR_MENU1をIDR_MAINMENUに変更・・・。ファイルを追加・・・。メニューハンドルm_hMenuとウィンドウハンドルm_hWndをもつCMenu・・・。今回はコンストラクタでCApplicationオブジェクトを引数に取るのではなく、ウィンドウハンドルを引数に取る・・・。そのため、SetMenuでウィンドウハンドルを指定する必要は無い・・・。OnCommandMenuItemは純粋仮想関数なので、派生クラス任せ・・・。Menu.cppは、LoadMenuでGetWindowLongでhInstanceを取得し、::LoadMenu時に指定・・・。m_hWndにウィンドウハンドルを保持しているので、SetMenuはそれを使えばいい・・・。ファイルを追加・・・。MainMenu.hは、OnCommandMenuItemの内部を実装する・・・。そこから分かれる独自ハンドラも・・・。OnCommandMenuItemのLOWORD(wParam)に選択されたメニューアイテムのIDが渡されるので、それごとに独自ハンドラに振り分け・・・。ハンドラの中はメッセージボックス出すだけ・・・。CMainWindowでCMainMenuの各メソッドを呼び出すようにする・・・。CMenuオブジェクトm_pMainMenuをもつ・・・。ハンドラOnCommandを実装する・・・。OnCreateで、CMainMenuオブジェクトをm_pMainMenuに格納したら、LoadMenu、SetMenuでメニューをセット・・・。OnDestroyで、m_pMainMenuを解放・・・。OnCommandでHIWORD(wParam)が0ならメニューなので、その時はm_pMainMenu->OnCommandMenuItemにメニューアイテム処理を任せる・・・。そもそもWM_COMMANDを処理できる状態にないので、CWindowを修正・・・。OnCommandは純粋仮想関数で追加・・・。実装はさきほどのMainWindow.cppに・・・。WM_COMMANDならOnCommandを呼ぶという部分を追加・・・。これでOnCommandが呼ばれる・・・。