- •Московская финансово-промышленная академия
- •Содержание
- •Глава 1. Модель программирования приложений
- •1.1. Потребительские свойства Windows
- •1.2. Процессы в Windows и потоковая многозадачность
- •1.3. Динамические библиотеки
- •1.4. Программное обеспечение для создания Win-приложений
- •Спецификация префиксов венгерской нотации
- •Глава 2. Обзор возможностей программирования
- •2.1. Общий взгляд на программирование в Windows
- •2.2. Взаимодействие Windows с программой
- •2.3. Win32 api: прикладной интерфейс для Windows
- •2.4. Компоненты окна
- •2.5. Основы приложений Windows
- •2.6. Каркас приложения Windows
- •2.7. Определение класса окна
- •Значения параметра lpszName
- •Наиболее употребляемые макросы для встроенных курсоров
- •Типы системных кистей
- •2.8. Создание окна
- •Наиболее распространенные стили
- •Параметры способа отображения nHow
- •2.9. Цикл обработки сообщений
- •2.10. Оконная функция
- •Типы префиксов
- •Глава 3. Обработка сообщений Windows
- •3.1. Что такое сообщения?
- •3.2. Обработка нажатая клавиш
- •Битовая карта lParam
- •3.3. Обработка сообщений wm_paint
- •3.4. Обработка сообщений «мыши»
- •3.5. Генерация сообщения wm_paint
- •3.6. Генерация сообщений таймера
- •Глава 4. Ресурсы и меню
- •4.1. Окна сообщений MessageBox
- •Значения функции MessageBox
- •Значения wMbType
- •4.2. Представляем меню
- •4.3. Использование ресурсов
- •Параметры menu
- •Параметры элементов меню
- •4.4. Включение меню в программу. Обработка команд
- •4.5. Включение акселераторов сменю
- •4.6. Загрузка таблицы акселераторов
- •Глава 5. Создание диалогов
- •5.1. Взаимодействие Win-диалогов с пользователем
- •5.2. Модальные диалоги: обработка сообщений
- •5.3. Активизация и создание простейшего диалога
- •5.4. Определение ресурсов диалога
- •Стили диалога
- •5.5. Оконная функция диалога
- •5.6. Основы работы со списками
- •Типы сообщений
- •5.7. Инициализация списка и выбор элементов
- •5.8. Окно ввода
- •5.9. Использование немодального диалога
- •Глава 6. Графические образы, иконки и курсоры
- •6.1. Иконка и курсор
- •6.2. Определение малой иконки
- •6.3. Работа с растровыми изображениями
- •Значения параметра dwRaster
- •6.4. Работа с несколькими растровыми изображениями
- •Глава 7. Более подробно об элементах управления
- •7.1. Работа с контрольными переключателями
- •7.2. Статические элементы
- •7.3. Работа с селекторными кнопками
- •7.4. Линейки прокрутки
4.5. Включение акселераторов сменю
Прежде чем закончить разговор о меню, следует упомянуть еще об одной возможности, связанной с ними. Это акселераторные клавиши, или акселераторы. Акселераторные клавиши – клавиатурные комбинации, которые Вы можете определить и которые, будучи нажаты, автоматически выбирают соответствующие им команды меню даже в том случае, когда меню не активно и не отображается. Иначе говоря, при помощи акселератора можно выбирать соответствующий элемент меню, не обращаясь к самому меню. Термин акселератор является довольно точным, поскольку ввод команд с использованием таких клавиш осуществляется гораздо быстрее, чем активизация меню и выбор этих команд.
Для определения акселераторов необходимо добавить таблицу акселераторов в файл ресурсов. Все определения акселераторов имеют следующий общий вид:
ИмяТаблицы ACCELERATORS
{
Клавиша1, MenuID1 [,тип] [,параметр]
Клавиша2, MenuID2 [,тип] [,параметр]
Клавишаn, MenuIDn [,тип] [,параметр]
}
Здесь:
ИмяТаблицы |
– является именем таблицы акселераторов; |
Клавиша |
– определяет клавишу или комбинацию клавиш акселератора; |
MenuID |
– это идентификатор элемента меню; |
Тип |
– указывает, является ли клавиша стандартной (по умолчанию) или виртуальной (ниже это понятие будет определено); |
Параметр |
– может быть одним из следующих макросов: NOINVERT, ALT, SHIFT и CONTROL. Наличие NOINVERT означает, что соответствующий элемент меню при использовании акселератора не будет подсвечен, даже если он присутствует на экране. Значение ALT указывает, что должна быть дополнительно нажата клавиша [Alt], а SHIFT и CONTROL специфицируют дополнительное нажатие клавиш [Shift] и [Ctrl]. |
Клавиша может быть символом в кавычках, либо целочисленным десятичным ASCII-кодом символа, либо виртуальной клавишей. Если указывается символ в кавычках, предполагается использование ASCII-символа. Если используется десятичное число, следует уточнить, что это код ASCII-символа, задав тип как ASCII. Если предполагается использование виртуальной клавиши, тип должен быть VIRTKEY.
Когда Клавиша представлена символом верхнего регистра в кавычках, соответствующая команда меню будет вызвана только в том случае, когда пользователь нажмет [Shift] вместе с указанной клавишей.
Если Клавиша представлена символом нижнего регистра, соответствующая команда меню будет вызвана только при нажатии заданной клавиши. В том случае, если Клавиша представлена символом нижнего регистра и задан параметр ALT, для вызова соответствующей команды необходимо нажать [Alt] и указанный символ, а если задан символ верхнего регистра и ALT, то для вызова команды нужно вместе с заданной клавишей нажимать [Shift] и [Alt]. Наконец, если требуется, чтобы для вызова команды использовалась комбинация [Ctrl+символ], символ в кавычках должен предваряться знаком ^.
Виртуальная клавиша – это системно-независимый код, определенный для основного набора служебных клавиш. Виртуальные клавиши включают определения функциональных клавиш [F1] ¸ [F12], стрелок и других не ASCII-клавиш. Они определены как макроимена в файле Windows.h. Все эти макроимена начинаются с VK_. Например, имена макросов для функциональных клавиш можно узнать из файла Windows.h. Для того чтобы использовать виртуальную клавишу как акселератор, нужно просто указать ее макроимя, а тип должен быть VIRTKEY. Можно также использовать ALT, SHIFT и CONTROL для задания соответствующих комбинаций клавиш.
Вот некоторые примеры:
"A", IDM_x // нажатие [Shift-A]
"a", IDM_x // нажатие а
"^А", IDM_x // нажатие [Ctrl-A]
"a", IDM_x, ALT // нажатие [Alt-A]
VK_F2, IDM_x // нажатие [F2]
VK_F2, IDM_x, SHIFT // нажатие [Shift-F2]
Вот как выглядит файл Menu.rc из предыдущего раздела с добавленной таблицей акселераторов:
// Пример файла ресурсов, описывающего меню
#include <Windows.h>
#include "Menu.h"
MYMENU MENU
{
POPUP "&Раз"
{
MENUITEM "&Альфа\tF2", IDM_ALPHA
MENUITEM "&Бета\tF3", IDM_BETA
}
POPUP "&Два"
{
MENUITEM "&Гамма\tShift+Г", IDM_GAMMA
POPUP "&Дельта"
{
MENUITEM "&Эпсилон\tCtrl+E", IDM_EPSILON
MENUITEM "&3ета\tCtrl+Z", IDM_ZETA
}
MENUITEM "&Эта\tCtrl+F4", IDM_ETA
MENUITEM "&Тэта\tF5", IDM_THETA
}
MENUITEM "&Помощь", IDM_HELP
}
// Определение акселераторов
MYMENU ACCELERATORS
{
VK_F2, IDM_ALPHA, VIRTKEY
VK_F3, IDM_BETA, VIRTKEY
"Г", IDM_GAMMA
"^Е", IDM_EPSILON
"^Z", IDM_ZETA
VK_F4, IDM_ETA, VIRTKEY, CONTROL
VK_F5, IDM_THETA, VIRTKEY
VK_F1, IDM_HELP, VIRTKEY
}
Заметьте, что названия элементов меню расширены и включают в себя названия акселераторов для вызова соответствующих команд. Каждый элемент отделяется от акселератора символом табуляции. Кроме того, включен файл Windows.h, поскольку в нем определены макроимена виртуальных клавиш.