Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Состояния кнопок Любая кнопка может находиться в следующих состояниях

Состояние

Описание

0

Нормальное, не “нажата”

TBSTATE_CHECKED

Помечена (“нажата”)

TBSTATE_ENABLED

Доступна для использования: если это состояние не установлено, кнопка недоступна, и изображение на ней блеклое

TBSTATE_HIDDEN

Невидима

TBSTATE_INDETERMINATE

Изображается блеклой

TBSTATE_PRESSED

Выбрана (“нажата”) мышью

TBSTATE_WRAP

Кнопка является последней в строке

 

Кнопка может быть либо командной (“нажата”/“отжата”), либо флажком (“установлен”/“сброшен”). На стандартной панели инструментов, формируемой каркасом приложений, все кнопки — командные.

Панель инструментов и командные сообщения

Когда пользователь щелкает кнопку на панели инструментов, генерируется командное сообщение. Оно доставляется подобно командным сообщениям от меню.

Чаще всего кнопка на панели инструментов дублирует команду меню. Например, кнопка с изображением дискеты на стандартной панели инструментов (формируемой каркасом приложений) эквивалентна команде Save из меню File. Обе генерируют команду ID__FILE_SAVE. A объекту, получившему командное сообщение, безразлично, сгенерировано оно щелчком кнопки на панели инструментов или выбором команды из меню.

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

С панелью инструментов связан ресурс растрового изображения и сопутствующий ресурс TOOLBAR в RC-файле, который определяет команды меню, связанные с кнопками. И растровое изображение, и ресурс TOOLBAR имеют одинаковый идентификатор — обычно это IDR_MAINFRAME. Вот содержимое ресурса TOOLBAR, сгенерирированное AppWizard:

IDR_MAINFRAME TOOLBAR DISCARDABLE 16, 15

BEGIN

BUTTON ID_FILE_NEW

BUTTON ID_FILE_OPEN

BUTTON ID_FILE_SAVE

SEPARATOR

BUTTON ID_EDIT_CUT

BUTTON ID_EDIT_COPY

BUTTON ID_EDIT_PASTE

SEPARATOR

BUTTON ID_FILE_PRINT

BUTTON ID_APP_ABOUT

END

Константы SEPARATOR позволяют отделять группы кнопок друг от друга. Если число кнопок в растровом изображении панели инструментов превосходит количество элементов в ресурсе (исключая разделители), лишние кнопки не показываются.

Редактируя панель инструментов в редакторе ресурсов, Вы изменяете и ресурс растрового изображения, и ресурс TOOLBAR. Чтобы отредактировать свойства кнопки, включая идентификатор, выберите ее изображение, а затем дважды щелкните левую панель.

Обновление пользовательского интерфейса для панелей инструментов

Обработчики сообщений обновления пользовательского интерфейса применяются, чтобы отключать команды меню или помечать их галочками. Эти же обработчики пригодны и для кнопок на панели инструментов. Если подобный обработчик вызывает функцию-член CCmdUI::Enable с параметром FALSE, соответствующая кнопка отключается (становится блеклой) и больше не реагирует на щелчки мышью.

Функция CCmdUI::SetCheck ставит рядом с командой меню галочку, а на панели инструментов реализует кнопку со свойствами флажка. После вызова SetCheck с параметром 1 кнопка “залипает” в нажатом состоянии, а с параметром 0 — возвращается в исходное, “отжатое” состояние.

Обработчики сообщений обновления пользовательского интерфейса для команд меню вызываются только при отрисовке элементов соответствующего меню. Но панель инструментов постоянно присутствует на экране. Возникает вопрос когда же вызывать обработчики обновления интерфейса? Чтобы состояние кнопок можно было постоянно обновлять, обработчики вызываются в моменты простоя приложения. Если для элемента меню и кнопки на панели инструментов используется один и тот же обработчик, он вызывается и в момент простоя, и при открытии меню.