Поделиться через


Образец DYNAMENU: динамическое обновление меню

Обновлен: Ноябрь 2007

Образец DYNAMENU иллюстрирует динамическое изменение меню и строк состояния, независимо от того, известны ли команды обработки на этапе компиляции. DYNAMENU иллюстрирует следующие возможности:

  • Динамическое обновление списка пунктов меню.

  • Реализация эквивалентов обработчиков ON_COMMAND и ON_UPDATE_COMMAND_UI для команд меню, чьи идентификаторы неизвестны во время компиляции. Этот же пример можно применять в более сложных случаях, например для меню, настраиваемых пользователем.

  • Обновление командной строки в строке состояния для команд, идентификаторы которых неизвестны во время выполнения.

s765c671.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению.

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды Visual Studio выберите пункт Примеры.

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

Построение и запуск образца

Построение и запуск образца DYNAMENU

  1. Откройте решение dynamenu.sln.

  2. В меню Построение выберите команду Построить.

  3. В меню Отладка выберите пункт Запуск без отладки.

Вначале DYNAMENU отображает окно, содержащее фразу "В этом тексте использован текущий цвет". Цвет текста можно изменить, выбрав один из четырех пунктов, первоначально включаемых в меню Цвет: "Черный", "Красный", "Сиреневый" и "Синий".

Чтобы продемонстрировать динамическое обновление меню в DYNAMENU, выберите Изменить параметры в меню Цвет; откроется диалоговое окно Изменение параметров цвета. Флажки черного, красного, сиреневого и синего цветов позволяют выбирать цвета, которые должны динамически включаться в меню Цвет. Например, если снять флажки красного и сиреневого цветов и вернуться в меню Цвет, в нем останутся только пункты "Черный" и "Синий".

Обратите внимание, что при перемещении фокуса, например, к пункту "Черный" меню Цвет в строке состояния появится текст "Назначить черный цвет текущим цветом текста".

Динамическое обновление списка пунктов меню

Класс CDynaMDIChildWnd в Mdichild.cpp реализует динамическое обновление пунктов меню Цвет. При обновлении списка доступных цветов или при активации дочернего окна MDI функция CDynaMDIChildWnd::RefreshColorMenu вызывает метод CMenu::DeleteMenu, чтобы удалить все пункты цветов из меню, а затем добавляет в меню доступные на данный момент цвета, используя CMenu::AppendMenu.

Реализация обработчиков команд для динамических пунктов меню

Образец DYNAMENU можно было бы реализовать путем резервирования фиксированного списка идентификаторов команд для цветов: ID_COLOR_BLACK, ID_COLOR_RED и т. д. В таком случае обработчики ON_COMMAND и ON_UPDATE_COMMAND_UI можно было бы реализовать для команд цветов обычным образом. Это самый простой способ реализации DYNAMENU.

Однако для большей наглядности в DYNAMENU не используются фиксированные идентификаторы команд. Вместо этого DYNAMENU динамически назначает идентификаторы команд, которые не были известны или не были связаны с пунктами меню во время компиляции. Этот же пример можно применять в более сложных случаях, например для меню, настраиваемых пользователем.

Эквивалент обработки карты сообщений ON_COMMAND и ON_UPDATE_COMMAND реализован в переопределении метода CCmdTarget::OnCmdMsg в документе. Если функция OnCmdMsg вызывается с указателем NULL в качестве параметра AFX_CMDHANDLERINFO*, это означает, что для команды не найден элемент карты сообщений. В этом случае переопределенный метод OnCmdMsg проверяет, является ли идентификатор команды, переданный в качестве первого параметра, одним из динамически назначаемых идентификаторов команд для пунктов меню цветов. Если это так, переопределенный метод вызывает обработчик команды (DoSelectColor) или обработчик пользовательского интерфейса команды (DoUpdateSelectColor), в зависимости от определенного в MFC значения второго параметра, переданного в OnCmdMsg: CN_COMMAND или CN_UPDATE_COMMAND_UI.

Обновление командной строки в строке состояния для динамических пунктов меню

В DYNAMENU владельцем строки состояния является дочернее окно MDI (CDynaMDIChildWnd). Реализация CFrameWnd::GetMessageString по умолчанию использует показанный идентификатор команды (для пункта меню, содержащего фокус в данный момент), чтобы получить соответствующий строковый ресурс для команды и отобразить ее в первой области строки состояния. 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(ru-ru,VS.90).gifПримечание.

Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи.

См. также

Другие ресурсы

Примеры MFC