次の方法で共有


DYNAMENU サンプル : メニューの動的更新

更新 : 2007 年 11 月

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

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

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

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

s765c671.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。

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

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

    詳細については、「サンプル ファイルの格納場所」を参照してください。

  • 使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。

  • サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。

サンプルのビルドと実行

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

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

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

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

まず、DYNAMENU では、"This text is displayed in the current color." というテキストが含まれているウィンドウが表示されます。表示されるテキストの色を変更するには、[Color] メニューに最初から用意されている 4 つの項目 [Black]、[Red]、[Purple]、または [Blue] のいずれかをクリックします。

DYNAMENU の動的メニュー更新を行うには、[Color] メニューの [Change Options] をクリックして、[Change Color Options] ダイアログ ボックスを開きます。[Black]、[Red]、[Purple]、および [Blue] の各チェック ボックスを使用すると、[Color] メニューに動的に設定される色を選択できます。たとえば、[Red] と [Purple] をオフにして [Color] メニューに戻ると、メニューには [Black] と [Blue] だけが表示されます。

たとえば、フォーカスを [Color] メニューの [Black] に合わせると、ステータス バーには "Set current color text to Black" と表示されます。

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

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

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

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

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

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

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

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

キーワード

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

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

s765c671.alert_note(ja-jp,VS.90).gifメモ :

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

参照

その他の技術情報

MFC サンプル