Пошаговое руководство. Размещение элементов управления на панели инструментов
В этой статье описывается, как добавить кнопку панели инструментов, содержащую элемент управления Windows на панель инструментов. В MFC кнопка панели инструментов должна быть классом, производным от CMFCToolBarButton, например класс CMFCToolBarComboBoxButton, класс CMFCToolBarEditBoxButton, класс CMFCDropDownToolbarButton или класс CMFCToolBarMenuButton.
Добавление элементов управления на панели инструментов
Чтобы добавить элемент управления на панель инструментов, выполните следующие действия.
Зарезервировать фиктивный идентификатор ресурса для кнопки в родительском ресурсе панели инструментов. Дополнительные сведения о том, как создавать кнопки с помощью редактора инструментов в Visual Studio, см. в статье редактора инструментов.
Зарезервировать изображение панели инструментов (значок кнопки) для кнопки во всех растровых изображениях родительской панели инструментов.
В обработчике сообщений, обрабатывающего
AFX_WM_RESETTOOLBAR
сообщение, сделайте следующее:Создайте элемент управления button с помощью производного
CMFCToolbarButton
класса.Замените фиктивную кнопку новым элементом управления с помощью CMFCToolBar::ReplaceButton. Объект кнопки можно создать в стеке, так как
ReplaceButton
копирует объект кнопки и сохраняет копию.
Примечание.
Если вы включили настройку в приложении, может потребоваться сбросить панель инструментов с помощью кнопки "Сброс" на вкладке "Панели инструментов" диалогового окна "Настройка", чтобы увидеть обновленный элемент управления в приложении после повторной компиляции. Состояние панели инструментов сохраняется в реестре Windows, а сведения о реестре загружаются и применяются после ReplaceButton
выполнения метода во время запуска приложения.
Элементы управления и настройка панели инструментов
Вкладка "Команды" диалогового окна "Настройка" содержит список команд, доступных в приложении. По умолчанию диалоговое окно "Настройка" обрабатывает меню приложения и создает список стандартных кнопок панели инструментов в каждой категории меню. Чтобы сохранить расширенные функциональные возможности, предоставляемые элементами управления панели инструментов, необходимо заменить стандартную кнопку панели инструментов пользовательским элементом управления в диалоговом окне "Настройка ".
При включении настройки диалоговое окно "Настройка" в обработчике OnViewCustomize
настройки создается с помощью класса CMFCToolBarsCustomizeDialog . Перед отображением диалогового окна "Настройка", вызвав CMFCToolBarsCustomizeDialog::Create, вызовите CMFCToolBarsCustomizeDialog::ReplaceButton, чтобы заменить стандартную кнопку новым элементом управления.
Пример. Создание поля со списком поиска
В этом разделе описывается, как создать элемент управления "Найти поле со списком", который отображается на панели инструментов и содержит недавно использованные строки поиска. Пользователь может ввести строку в элементе управления, а затем нажать клавишу ВВОД для поиска документа или нажать клавишу ESCAPE, чтобы вернуть фокус в основной кадр. В этом примере предполагается, что документ отображается в представлении на основе класса CEditView.
Создание элемента управления "Поиск"
Сначала создайте элемент управления "Поиск со списком":
Добавьте кнопку и ее команды в ресурсы приложения:
В ресурсах приложения добавьте новую кнопку с идентификатором команды на панель инструментов в приложении и любые растровые изображения, связанные с
ID_EDIT_FIND
панелью инструментов.Создайте новый пункт меню с идентификатором
ID_EDIT_FIND
команды.Добавьте новую строку "Найти текст\nFind" в строку таблицы и назначьте ей
ID_EDIT_FIND_COMBO
идентификатор команды. Этот идентификатор будет использоваться в качестве идентификатора команды кнопки "Найти поле со списком".Примечание.
Так как
ID_EDIT_FIND
это стандартная команда, обрабатываемаяCEditView
, вам не требуется реализовать специальный обработчик для этой команды. Однако необходимо реализовать обработчик для новой командыID_EDIT_FIND_COMBO
.
Создайте класс,
CFindComboBox
производный от класса CComboBox.В классе переопределите
CFindComboBox
виртуальныйPreTranslateMessage
метод. Этот метод позволит поле со списком обрабатывать сообщение WM_KEYDOWN . Если пользователь попадает на экранный ключ (VK_ESCAPE
), верните фокус в главное окно кадра. Если пользователь нажимает клавишу ВВОД (VK_ENTER
), опубликуй сообщение в главном окнеWM_COMMAND
кадра сообщение, содержащееID_EDIT_FIND_COMBO
идентификатор команды.Создайте класс для кнопки "Найти поле со списком", производный от класса CMFCToolBarComboBoxButton. В этом примере используется имя
CFindComboButton
.Конструктор
CMFCToolbarComboBoxButton
принимает три параметра: идентификатор команды кнопки, индекс изображения кнопки и стиль поля со списком. Задайте следующие параметры:Передайте идентификатор
ID_EDIT_FIND_COMBO
команды в качестве идентификатора команды.Используйте CCommandManager::GetCmdImage ,
ID_EDIT_FIND
чтобы получить индекс изображения.Список доступных стилей полей со списком см. в разделе "Стили со списком".
В классе
CFindComboButton
переопределите методCMFCToolbarComboBoxButton::CreateCombo
. Здесь необходимо создатьCFindComboButton
объект и вернуть указатель на него.Используйте макрос IMPLEMENT_SERIAL, чтобы сделать кнопку со списком постоянной. Диспетчер рабочей области автоматически загружает и сохраняет состояние кнопки в реестре Windows.
Реализуйте обработчик в представлении
ID_EDIT_FIND_COMBO
документа. Используйте CMFCToolBar::GetCommandButtons,ID_EDIT_FIND_COMBO
чтобы получить все кнопки поля со списком поиска. Из-за настройки может быть несколько копий кнопки с одинаковым идентификатором команды.В обработчике
ID_EDIT_FIND
OnFind
сообщений используйте CMFCToolBar::IsLastCommandFromButton, чтобы определить, была ли команда поиска отправлена с кнопки "Найти со списком". В этом случае найдите текст и добавьте строку поиска в поле со списком.
Добавление элемента управления "Поиск" на главную панель инструментов
Чтобы добавить кнопку со списком на панель инструментов, выполните следующие действия:
AFX_WM_RESETTOOLBAR
Реализуйте обработчикOnToolbarReset
сообщений в окне основного кадра.Примечание.
Платформа отправляет это сообщение в главное окно фрейма при инициализации панели инструментов во время запуска приложения или при сбросе панели инструментов во время настройки. В любом случае необходимо заменить стандартную кнопку панели инструментов на настраиваемую кнопку "Найти со списком".
В обработчике
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