DYNAMENU サンプルでは、処理するコマンドがコンパイル時に判明しているかどうかに関係なく、メニューやステータス バーを動的に更新する方法を示します。 DYNAMENU では、次の機能を示しています。

  • メニューの項目一覧の動的更新。

  • コンパイル時に ID が不明なメニュー コマンドに対して、ON_COMMAND ハンドラーおよび ON_UPDATE_COMMAND_UI ハンドラーに等しいハンドラーの実装。 この説明は、ユーザーが構成できるメニューなど、より複雑な場合に適用できます。

  • コンパイル時に ID が不明なコマンドに対するステータス バー コマンド プロンプトの更新。

セキュリティに関するメモセキュリティに関するメモ

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルとそのインストール手順を取得するには

Visual Studio のサンプルにアクセスするには

  • [ヘルプ] メニューの [サンプル] をクリックします。

    既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。

  • このサンプルの最新版および他のサンプルの一覧については、MSDN Web サイト上で Visual Studio サンプル 」を参照してください。

サンプルのビルドと実行

DYNAMENU サンプルをビルドおよび実行するには

  1. ソリューション dynamenu.sln を開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. でデバッグ メニューの、[デバッグなしで開始 をクリックします。

DYNAMENU 最初はウィンドウにテキストが表示されます。「このテキストは、現在の色で表示されます」。最初の メニューで提供されている 4 つの項目のいずれかを選択して、表示されるテキストの色を変更できます。黒、赤、紫、または青。

動的メニュー更新機能の DYNAMENU を練習するには、 色オプションの変更の ダイアログ ボックスを開きますメニュー オプションの変更 をクリックします。 黒、赤、紫、および青のチェック ボックスを使用するどの色が動的に メニューで提供されているを選択できます。 たとえば、赤と紫をオフにし、 メニューに戻る場合は、黒と青アイテムのみ] メニューで提供されます。

ステータス バー、たとえば、「設定現在テキスト色を黒、」表示方法に注意してください。黒項目色 メニュー内のフォーカスがある場合。

メニュー項目一覧の動的更新

クラス CDynaMDIChildWnd Mdichild.cpp でカラー メニュー内のアイテムの動的更新を実装します。 使用できる色の一覧が更新されたとき、または時、MDI 子ウィンドウがアクティブになった、CDynaMDIChildWnd::RefreshColorMenu 関数呼び出しの各色アイテム] メニューの [削除するのには、 CMenu::DeleteMenu し、現在利用できる色 CMenu::AppendMenu を使用して、メニューに追加します。

動的メニュー項目のためのコマンド ハンドラーの実装

DYNAMENU は、コマンド ID、色の固定リストを予約することによって実装されている可能性があります。ID_COLOR_BLACK, ID_COLOR_RED と続きます。 このような場合には、ON_COMMAND ハンドラーや ON_UPDATE_COMMAND_UI ハンドラーは、通常どおりにカラー コマンドに対して実装されます。 この方法は、DYNAMENU を実装する最も簡単な方法です。

ただし、この DYNAMENU の例では、固定コマンド ID を使用しません。 その代わりに、DYNAMENU では、コンパイル時に確定できない、またはメニュー項目に関連付けられていないコマンド ID を動的に割り当てます。 この説明は、ユーザーが構成できるメニューなど、より複雑な場合に適用できます。

相当 ON_COMMANDON_UPDATE_COMMAND メッセージの対応付け処理 CCmdTarget::OnCmdMsg のドキュメントのオーバーライドで実装されています。 OnCmdMsg 関数が、NULL ポインターで呼び出されるかどうかは、 AFX_CMDHANDLERINFO***** パラメーターは、このメッセージ マップ エントリに対応するコマンドを見つかりましたしないことを意味します。 この場合、OnCmdMsg のオーバーライドでは、第 1 パラメーターとして渡されたコマンド ID が、色のメニュー項目に動的に割り当てられるコマンド ID かどうかをチェックします。 場合は、オーバーライドのいずれかのコマンド ハンドラー (DoSelectColor) を呼び出し、または 2 番目のパラメーターに渡さDoUpdateSelectColorするかどうかに応じてコマンド ユーザー インターフェイス ハンドラー ( OnCmdMsg ) は、MFC で定義されます CN_COMMAND または CN_UPDATE_COMMAND_UI。

動的メニュー項目のステータス バー コマンド プロンプトの更新

DYNAMENU では、ステータス バー、MDI 子ウィンドウ (CDynaMDIChildWnd) を所有しています。 CFrameWnd::GetMessageString の既定の実装では、現在表示されているコマンド ID (現在フォーカスがあるメニュー項目のコマンド ID) を使用して、そのコマンドに対応する文字列リソースを取得し、ステータス バーの最初のペインにその文字列を表示します。 DYNAMENU は、GetMessageString をオーバーライドして、動的に定義されたコマンドのコマンド プロンプトを表示します。

Keywords

このサンプルでは、次のキーワードを使用します。

AfxFormatString1; AfxGetMainWnd; CCmdTarget::OnCmdMsg; CDialog::DoModal; CDialog::OnInitDialog; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::UpdateAllViews; CFrameWnd::Create; CFrameWnd::GetActiveDocument; CFrameWnd::GetMessageString; CFrameWnd::LoadFrame; CMenu::AppendMenu; CMenu::DeleteMenu; CMenu::GetMenuItemCount; CMenu::GetMenuItemID; CMenu::GetSubMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CString::LoadString; CView::DoPreparePrinting; CView::GetDocument; CView::OnBeginPrinting; CView::OnDraw; CView::OnEndPrinting; CView::OnPreparePrinting; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::CenterWindow; CWnd::DoDataExchange; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetMenu; CWnd::GetParentFrame; CWnd::OnCreate; CWnd::SetWindowText; CWnd::ShowWindow; CWnd::UpdateWindow; DragAcceptFiles; DrawText; LoadBitmap; RGB; SetBkMode; SetTextColor

注意

このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。

参照

その他の技術情報

MFC サンプル