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


Пошаговое руководство. Размещение элементов управления на панели инструментов

В этой статье описывается, как добавить кнопку панели инструментов, содержащую элемент управления Windows на панель инструментов. В MFC кнопка панели инструментов должна быть классом, производным от CMFCToolBarButton, например класс CMFCToolBarComboBoxButton, класс CMFCToolBarEditBoxButton, класс CMFCDropDownToolbarButton или класс CMFCToolBarMenuButton.

Добавление элементов управления на панели инструментов

Чтобы добавить элемент управления на панель инструментов, выполните следующие действия.

  1. Зарезервировать фиктивный идентификатор ресурса для кнопки в родительском ресурсе панели инструментов. Дополнительные сведения о том, как создавать кнопки с помощью редактора инструментов в Visual Studio, см. в статье редактора инструментов.

  2. Зарезервировать изображение панели инструментов (значок кнопки) для кнопки во всех растровых изображениях родительской панели инструментов.

  3. В обработчике сообщений, обрабатывающего AFX_WM_RESETTOOLBAR сообщение, сделайте следующее:

    1. Создайте элемент управления button с помощью производного CMFCToolbarButtonкласса.

    2. Замените фиктивную кнопку новым элементом управления с помощью CMFCToolBar::ReplaceButton. Объект кнопки можно создать в стеке, так как ReplaceButton копирует объект кнопки и сохраняет копию.

Примечание.

Если вы включили настройку в приложении, может потребоваться сбросить панель инструментов с помощью кнопки "Сброс" на вкладке "Панели инструментов" диалогового окна "Настройка", чтобы увидеть обновленный элемент управления в приложении после повторной компиляции. Состояние панели инструментов сохраняется в реестре Windows, а сведения о реестре загружаются и применяются после ReplaceButton выполнения метода во время запуска приложения.

Элементы управления и настройка панели инструментов

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

При включении настройки диалоговое окно "Настройка" в обработчике OnViewCustomize настройки создается с помощью класса CMFCToolBarsCustomizeDialog . Перед отображением диалогового окна "Настройка", вызвав CMFCToolBarsCustomizeDialog::Create, вызовите CMFCToolBarsCustomizeDialog::ReplaceButton, чтобы заменить стандартную кнопку новым элементом управления.

Пример. Создание поля со списком поиска

В этом разделе описывается, как создать элемент управления "Найти поле со списком", который отображается на панели инструментов и содержит недавно использованные строки поиска. Пользователь может ввести строку в элементе управления, а затем нажать клавишу ВВОД для поиска документа или нажать клавишу ESCAPE, чтобы вернуть фокус в основной кадр. В этом примере предполагается, что документ отображается в представлении на основе класса CEditView.

Создание элемента управления "Поиск"

Сначала создайте элемент управления "Поиск со списком":

  1. Добавьте кнопку и ее команды в ресурсы приложения:

    1. В ресурсах приложения добавьте новую кнопку с идентификатором команды на панель инструментов в приложении и любые растровые изображения, связанные с ID_EDIT_FIND панелью инструментов.

    2. Создайте новый пункт меню с идентификатором ID_EDIT_FIND команды.

    3. Добавьте новую строку "Найти текст\nFind" в строку таблицы и назначьте ей ID_EDIT_FIND_COMBO идентификатор команды. Этот идентификатор будет использоваться в качестве идентификатора команды кнопки "Найти поле со списком".

      Примечание.

      Так как ID_EDIT_FIND это стандартная команда, обрабатываемая CEditView, вам не требуется реализовать специальный обработчик для этой команды. Однако необходимо реализовать обработчик для новой команды ID_EDIT_FIND_COMBO.

  2. Создайте класс, CFindComboBoxпроизводный от класса CComboBox.

  3. В классе переопределите CFindComboBox виртуальный PreTranslateMessage метод. Этот метод позволит поле со списком обрабатывать сообщение WM_KEYDOWN . Если пользователь попадает на экранный ключ (VK_ESCAPE), верните фокус в главное окно кадра. Если пользователь нажимает клавишу ВВОД (VK_ENTER), опубликуй сообщение в главном окне WM_COMMAND кадра сообщение, содержащее ID_EDIT_FIND_COMBO идентификатор команды.

  4. Создайте класс для кнопки "Найти поле со списком", производный от класса CMFCToolBarComboBoxButton. В этом примере используется имя CFindComboButton.

  5. Конструктор CMFCToolbarComboBoxButton принимает три параметра: идентификатор команды кнопки, индекс изображения кнопки и стиль поля со списком. Задайте следующие параметры:

    1. Передайте идентификатор ID_EDIT_FIND_COMBO команды в качестве идентификатора команды.

    2. Используйте CCommandManager::GetCmdImage , ID_EDIT_FIND чтобы получить индекс изображения.

    3. Список доступных стилей полей со списком см. в разделе "Стили со списком".

  6. В классе CFindComboButton переопределите методCMFCToolbarComboBoxButton::CreateCombo. Здесь необходимо создать CFindComboButton объект и вернуть указатель на него.

  7. Используйте макрос IMPLEMENT_SERIAL, чтобы сделать кнопку со списком постоянной. Диспетчер рабочей области автоматически загружает и сохраняет состояние кнопки в реестре Windows.

  8. Реализуйте обработчик в представлении ID_EDIT_FIND_COMBO документа. Используйте CMFCToolBar::GetCommandButtons, ID_EDIT_FIND_COMBO чтобы получить все кнопки поля со списком поиска. Из-за настройки может быть несколько копий кнопки с одинаковым идентификатором команды.

  9. В обработчике ID_EDIT_FIND OnFindсообщений используйте CMFCToolBar::IsLastCommandFromButton, чтобы определить, была ли команда поиска отправлена с кнопки "Найти со списком". В этом случае найдите текст и добавьте строку поиска в поле со списком.

Добавление элемента управления "Поиск" на главную панель инструментов

Чтобы добавить кнопку со списком на панель инструментов, выполните следующие действия:

  1. AFX_WM_RESETTOOLBAR Реализуйте обработчик OnToolbarReset сообщений в окне основного кадра.

    Примечание.

    Платформа отправляет это сообщение в главное окно фрейма при инициализации панели инструментов во время запуска приложения или при сбросе панели инструментов во время настройки. В любом случае необходимо заменить стандартную кнопку панели инструментов на настраиваемую кнопку "Найти со списком".

  2. В обработчике AFX_WM_RESETTOOLBAR проверьте идентификатор панели инструментов, то есть WPARAM сообщения AFX_WM_RESETTOOLBAR. Если идентификатор панели инструментов равен идентификатору панели инструментов, содержащей кнопку "Найти поле со списком", вызовите CMFCToolBar::ReplaceButton , чтобы заменить кнопку "Найти " (т. е. кнопку с идентификатором ID_EDIT_FIND) CFindComboButton команды объектом.

    Примечание.

    Объект можно создать CFindComboBox в стеке, так как ReplaceButton копирует объект кнопки и сохраняет копию.

Добавление элемента управления "Поиск" в диалоговое окно "Настройка"

В обработчике настройки вызовите CMFCToolBarsCustomizeDialog::ReplaceButton, чтобы заменить кнопку "Найти" (т. е. кнопку с идентификатором ID_EDIT_FINDкоманды) CFindComboButton объектом.OnViewCustomize

См. также

Диаграмма иерархии
Классы
Класс CMFCToolBar
Класс CMFCToolBarButton
Класс CMFCToolBarComboBoxButton
Класс CMFCToolBarsCustomizeDialog