DYNAMENU 示例:动态更新菜单

更新:2007 年 11 月

DYNAMENU 示例阐释如何动态修改菜单和状态栏,不论处理命令在编译时是否是已知的。DYNAMENU 阐释下列功能:

  • 动态更新菜单项列表。

  • 为 ID 在编译时未知的菜单命令实现 ON_COMMANDON_UPDATE_COMMAND_UI 处理程序的等效项。此说明可应用于更复杂的情况,如用户可以配置的菜单。

  • 为 ID 在编译时未知的命令更新状态栏命令提示。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行 DYNAMENU 示例

  1. 打开解决方案 dynamenu.sln。

  2. 在“生成”菜单中单击“生成”。

  3. 在“调试”菜单中,单击“开始执行(不调试)”。

DYNAMENU 最初显示一个包含文本“This text is displayed in the current color”的窗口。通过选择“Color”菜单中最初提供的四项(“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 ID_COLOR_BLACKID_COLOR_RED 等的固定列表来实现 DYNAMENU。在这种情况下,可照常为颜色命令实现 ON_COMMANDON_UPDATE_COMMAND_UI 处理程序。这是实现 DYNAMENU 的最简单的方法。

然而,为便于说明,DYNAMENU 不使用固定命令 ID。相反,DYNAMENU 在编译时动态分配未知的或与菜单项关联的命令 ID。此说明可应用于更复杂的情况,如用户可以配置的菜单。

ON_COMMANDON_UPDATE_COMMAND 消息映射处理的等效项在文档的 CCmdTarget::OnCmdMsg 重写中实现。如果用 AFX_CMDHANDLERINFO* 参数的 null 指针调用 OnCmdMsg 函数,这意味着未找到命令的任何消息映射项。在这种情况下,OnCmdMsg 重写检查作为第一个参数传递的命令 ID 是否是颜色菜单项动态分配的命令 ID 之一。如果是,该重写调用命令处理程序 (DoSelectColor) 或命令用户接口处理程序 (DoUpdateSelectColor),具体取决于传递给 OnCmdMsg 的第二个参数是 MFC 定义的 CN_COMMAND 还是 CN_UPDATE_COMMAND_UI

更新动态菜单项的状态栏命令提示

在 DYNAMENU 中,MDI 子窗口 (CDynaMDIChildWnd) 拥有状态栏。CFrameWnd::GetMessageString 的默认实现(对当前在菜单中具有焦点的项)使用当前显示的命令 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

说明:

某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

MFC 示例