Сведения об акселераторах клавиатуры
Акселераторы тесно связаны с менюми— оба предоставляют пользователю доступ к набору команд приложения. Как правило, пользователи полагаются на меню приложения, чтобы узнать набор команд, а затем переключиться на использование акселераторов, так как они становятся более опытными в приложении. Ускорители обеспечивают более быстрый, более прямой доступ к командам, чем меню. Как минимум, приложение должно предоставлять акселераторы для более распространенных используемых команд. Хотя ускорители обычно создают команды, которые существуют в качестве элементов меню, они также могут создавать команды, не имеющие эквивалентных элементов меню.
В этом разделе рассматриваются следующие разделы.
- таблицы акселераторов
- Accelerator-Table создания
- назначения клавиш акселератора
- акселераторы и меню
- состояния пользовательского интерфейса
Таблицы акселераторов
Таблица акселераторов состоит из массива структур ACCEL, каждая из которых определяет отдельный акселератор. Каждая структура ACCEL включает следующую информацию:
- Сочетание нажатия клавиш акселератора.
- Идентификатор акселератора.
- Различные флаги. Это включает в себя тот, который указывает, должна ли система предоставлять визуальную обратную связь путем выделения соответствующего элемента меню, если таковые имеются при использовании акселератора.
Чтобы обработать нажатия клавиш акселератора в указанном потоке, разработчик должен вызвать функцию TranslateAccelerator в цикле обработки сообщений, связанном с очередью сообщений этого потока. Функция TranslateAccelerator отслеживает ввод с клавиатуры в очередь сообщений, проверяя сочетания клавиш, которые соответствуют записи в таблице ускорителей. Когда TranslateAccelerator находит совпадение, он преобразует входные данные клавиатуры (то есть сообщения WM_KEYUP и WM_KEYDOWN) в сообщение WM_COMMAND или WM_SYSCOMMAND, а затем отправляет его в процедуру указанного окна. На следующем рисунке показано, как обрабатываются акселераторы.
Сообщение WM_COMMAND содержит идентификатор акселератора, вызвавшего TranslateAccelerator для создания сообщения. Процедура окна проверяет идентификатор, чтобы определить источник сообщения, а затем обрабатывает сообщение соответствующим образом.
Таблицы акселератора существуют на двух разных уровнях. Система поддерживает одну таблицу акселераторов на уровне системы, которая применяется ко всем приложениям. Приложение не может изменить таблицу системного акселератора. Описание акселераторов, предоставляемых таблицей акселераторов системы, см. в разделе Назначения клавиш акселератора.
Система также поддерживает таблицы акселераторов для каждого приложения. Приложение может определить любое количество таблиц акселераторов для использования с собственными окнами. Уникальный 32-разрядный дескриптор (HACCEL) определяет каждую таблицу. Однако для указанного потока может быть активна только одна таблица акселераторов. Дескриптор таблицы акселератора, переданной в функцию TranslateAccelerator, определяет, какая таблица акселератора активна для потока. Активная таблица акселераторов может быть изменена в любое время путем передачи другого дескриптора таблицы акселераторов в TranslateAccelerator.
Создание Accelerator-Table
Для создания таблицы акселератора для приложения необходимо выполнить несколько шагов. Во-первых, компилятор ресурсов используется для создания ресурсов ускорителя и добавления их в исполняемый файл приложения. Во время выполнения функция LoadAccelerators используется для загрузки таблицы ускорителей в память и извлечения дескриптора таблицы ускорителей. Этот дескриптор передается функции TranslateAccelerator для активации таблицы акселераторов.
Кроме того, таблицу ускорителей можно создать для приложения во время выполнения, передав массив структур ACCEL в функцию CreateAcceleratorTable. Этот метод поддерживает определяемые пользователем ускорители в приложении. Как и функция LoadAccelerators, CreateAcceleratorTable возвращает дескриптор таблицы акселераторов, который можно передать в TranslateAccelerator для активации таблицы акселераторов.
Система автоматически уничтожает таблицы ускорителей, загруженные с помощью LoadAccelerators или созданные с помощью CreateAcceleratorTable. Однако приложение может освободить ресурсы, во время выполнения, уничтожая таблицы акселераторов, которые больше не нужны, вызвав функцию DestroyAcceleratorTable.
Существующую таблицу акселераторов можно скопировать и изменить. Существующая таблица акселераторов копируется с помощью функции CopyAcceleratorTable. После изменения копии, идентификатор новой таблицы акселератора извлекается путем вызова CreateAcceleratorTable. Наконец, дескриптор передается в TranslateAccelerator для активации новой таблицы.
Назначения нажатия клавиш акселератора
Код символов ASCII или код виртуального ключа можно использовать для определения акселератора. Код символов ASCII учитывает регистр акселератора. Таким образом, использование символа ASCII "C" определяет ускоритель как ALT+C, а не ALT+c. Однако акселераторы с учетом регистра могут вызывать путаницу при использовании. Например, акселератор ALT+C будет сгенерирован, если зажата клавиша CAPS LOCK или клавиша SHIFT, но не если обе клавиши зажаты.
Обычно ускорители не должны зависеть от регистра, поэтому большинство приложений используют коды виртуальных клавиш для ускорителей, а не коды символов ASCII.
Избегайте акселераторов, конфликтующих с мнемониками меню приложения, так как акселератор переопределяет мнемонику, что может запутать пользователя. Дополнительные сведения о сочетаниях клавиш для меню см. в меню.
Если приложение определяет акселератор, который также определен в таблице системных акселераторов, то определяемый приложением акселератор переопределяет системный акселератор, но только в контексте приложения. Избегайте этой практики, так как она запрещает системным акселератору выполнять стандартную роль в пользовательском интерфейсе. Акселераторы на уровне системы описаны в следующем списке:
Акселератор | Описание |
---|---|
ALT+ESC | Переключается на следующее приложение. |
ALT+F4 | Закрывает приложение или окно. |
ALT+ДЕФИС | Открывает меню окна для окна документа. |
ALT+PRINT SCREEN | Копирует изображение из активного окна на буфер обмена. |
ALT+ПРОБЕЛ | Открывает меню окна для главного окна приложения. |
ALT+TAB | Переключается на следующее приложение. |
CTRL+ESC | Переключается в меню "Пуск". |
CTRL+F4 | Закрывает активную группу или окно документа. |
F1 | Запускает файл справки приложения, если он существует. |
ЭКРАН ПЕЧАТИ | Копирует изображение на экране в буфер обмена. |
SHIFT+ALT+TAB | Переключается на предыдущее приложение. Пользователь должен нажать и удерживать клавишу ALT+SHIFT при нажатии КЛАВИШИ TAB. |
Акселераторы и меню
Использование акселератора совпадает с выбором пункта меню: оба действия приводят к отправке системой WM_COMMAND или WM_SYSCOMMAND сообщения в соответствующую процедуру окна. Сообщение WM_COMMAND содержит идентификатор, который проверяет процедура окна для определения источника сообщения. Если акселератор создал сообщение WM_COMMAND, идентификатор — это акселератор. Аналогичным образом, если элемент меню создал сообщение WM_COMMAND, идентификатор соответствует элементу меню. Так как акселератор предоставляет ярлык для выбора команды из меню, приложение обычно назначает тот же идентификатор акселератору и соответствующему элементу меню.
Приложение обрабатывает сообщение акселератора WM_COMMAND точно так же, как соответствующее сообщение меню WM_COMMAND. Однако сообщение WM_COMMAND содержит флаг, указывающий, возникает ли сообщение из акселератора или элемента меню, если акселераторы должны обрабатываться по-разному от соответствующих элементов меню. Сообщение WM_SYSCOMMAND не содержит этот флаг.
Идентификатор определяет, создает ли акселератор сообщение WM_COMMAND или WM_SYSCOMMAND. Если идентификатор имеет то же значение, что и элемент меню в меню "Система", акселератор создает сообщение WM_SYSCOMMAND. В противном случае акселератор создает сообщение WM_COMMAND.
Если у акселератора тот же идентификатор, что и у элемента меню, и элемент меню отключен или недоступен, то акселератор также отключается и не создает сообщение WM_COMMAND или WM_SYSCOMMAND. Кроме того, акселератор не создает командное сообщение, если соответствующее окно свернуто.
Когда пользователь использует акселератор, соответствующий элементу меню, процедура окна получает WM_INITMENU и WM_INITMENUPOPUP сообщения, как будто пользователь выбрал элемент меню. Сведения об обработке этих сообщений см. в меню.
Акселератор, соответствующий элементу меню, должен быть включен в текст элемента меню.
Состояние пользовательского интерфейса
Windows позволяет приложениям скрывать или отображать различные функции в пользовательском интерфейсе. Эти параметры называются состоянием пользовательского интерфейса. Состояние пользовательского интерфейса включает следующие параметры:
- Индикаторы фокуса (например, прямоугольники фокуса на кнопках)
- акселераторы клавиатуры (отмечены подчеркиванием в метках элементов управления)
Окно может отправлять сообщения для запроса изменения состояния пользовательского интерфейса, запрашивать состояние пользовательского интерфейса или применять определенное состояние для дочерних окон. Эти сообщения приведены следующим образом.
Сообщение | Описание |
---|---|
WM_CHANGEUISTATE | Указывает, что состояние пользовательского интерфейса должно измениться. |
WM_QUERYUISTATE | Извлекает состояние пользовательского интерфейса для окна. |
WM_UPDATEUISTATE | Изменяет состояние пользовательского интерфейса. |
По умолчанию все дочерние окна окна верхнего уровня создаются с тем же состоянием пользовательского интерфейса, что и родительский.
Система обрабатывает состояние пользовательского интерфейса для элементов управления в диалоговых окнах. При создании диалогового окна система инициализирует состояние пользовательского интерфейса соответствующим образом. Все дочерние элементы управления наследуют это состояние. После создания диалогового окна система отслеживает нажатия клавиш пользователя. Если параметры состояния пользовательского интерфейса скрыты, а пользователь переходит с помощью клавиатуры, система обновляет состояние пользовательского интерфейса. Например, если пользователь нажимает клавишу Tab, чтобы переместить фокус на следующий элемент управления, система вызывает WM_CHANGEUISTATE, чтобы сделать индикаторы фокуса видимыми. Если пользователь нажимает клавишу ALT, системные вызовы WM_CHANGEUISTATE, чтобы сделать ускорители клавиатуры видимыми.
Если элемент управления поддерживает навигацию между элементами пользовательского интерфейса, которые он содержит, он может обновить собственное состояние пользовательского интерфейса. Элемент управления может вызывать WM_QUERYUISTATE для получения и кэширования исходного состояния пользовательского интерфейса. Каждый раз, когда элемент управления получает сообщение WM_UPDATEUISTATE, он может обновить его состояние пользовательского интерфейса и отправить WM_CHANGEUISTATE сообщение родительскому элементу. Каждое окно будет продолжать отправлять сообщение родительскому элементу, пока не достигнет окна верхнего уровня. Окно верхнего уровня отправляет сообщение WM_UPDATEUISTATE окнам в дереве окон. Если окно не передает сообщение WM_CHANGEUISTATE, оно не достигнет окна верхнего уровня и состояние пользовательского интерфейса не будет обновлено.