
- •1. Краткие теоретические сведения
- •1.1. Общие положения о программировании в Windows
- •1.2.Общие правила вызова функций api
- •1.3. Структура окна
- •1.4. Понятие ресурсов в ос Windows
- •1.4.1. Иконки
- •1.4.2. Курсоры
- •1.4.3. Битовые картинки (*.Bmp)
- •1.4.4. Строки
- •1.4.5.Диалоговые окна
- •1.4.6. Меню
- •1.4.7. Акселераторы
- •2. Описание используемых api-функций и констант
- •2.1. Используемые константы
- •2.2. Используемые функции
- •3. Листинг
- •4. Результат работы программы
1.4.7. Акселераторы
На первый взгляд этот вопрос достаточно прост, но, как станет ясно, он потянет за собой множество других. Акселератор позволяет выбирать пункт меню просто сочетанием клавиш.
Это очень удобно и быстро. Таблица акселераторов является ресурсом, имя которого должно совпадать с именем того меню (ресурса), пункты которого она определяет.
Вот пример такой таблицы. Определяется один акселератор на пункт меню MENUP, имеющий идентификаторы.
#define VK_F1 0x70
#define VK_F2 0x71
#define VK_F3 0x72
#define VK_F4 0x73
#define VK_F5 0x74
#define VK_F6 0x75
#define VK_F7 0x76
MENUP ACCELERATORS
{
VK_F1, 1, VIRTKEY
VK_F2, 2, VIRTKEY
VK_F3, 3, VIRTKEY
VK_F4, 4, VIRTKEY
VK_F5, 5, VIRTKEY
VK_F6, 6, VIRTKEY
VK_F7, 7, VIRTKEY
}
А вот общий вид таблицы акселераторов.
Имя ACCELERATORS
{
Клавиша 1, Идентификатор пункта меню (1) [,тип] [,параметр]
Клавиша 2, Идентификатор пункта меню (2) [,тип] [,параметр]
Клавиша 3, Идентификатор пункта меню (3) [,тип] [,параметр]
...
Клавиша N, Идентификатор пункта меню (N) [,тип] [,параметр]
}
Клавиша - это либо символ в кавычках, либо код ASCII символа, либо виртуальная клавиша. Если вначале стоит код символа, то тип задается как ASCII. Если используется виртуальная клавиша, то тип определяется как VIRTUAL.
Параметр может принимать одно из следующих значений: NOINVERT, ALT, CONTROL, SHIFT. Значение NOINVERT означает, что не подсвечивается выбранный при помощи акселератора пункт меню. Значения ALT, SHIFT, CONTROL означают, что, кроме клавиши, определенной в акселераторе, должна быть нажата одна из управляющих клавиш.
Для того чтобы акселераторы работали, необходимо выполнить два условия:
Должна быть загружена таблица акселераторов. Для этого используется функция LoadAccelerators.
Сообщения, пришедшие от акселератора, следует преобразовать в сообщение WM_COMMAND. Здесь нам пригодится функция TranslateAccelerator.
Остановимся подробнее на втором пункте. Функция TranslateAccelerator преобразует сообщения WM_KEYDOWN и WM_SYSKEYDOWN в сообщения WM_COMMAND и WM_SYSCOMMAND соответственно. При этом в старшем слове параметра WPARAM помещается 1, как отличие для акселератора. В младшем слове содержится идентификатор пункта меню.
Функция TranslateAccelerator возвращает ненулевое значение, если было произведено преобразование сообщения акселератора, в противном случае возвращается 0. Естественно включить вызов этой функции в кольцо сообщений. Рассмотрим пример программы:
MSG_LOOP:
INVOKE GetMessageA,OFFSET MSG,0,0,0
CMP EAX, 0
JE END_LOOP
; транслировать сообщение акселератора
INVOKE TranslateAcceleratorA,[NEWHWND], [ACC], OFFSET MSG
CMP EAX,0
JNE MSG_LOOP
INVOKE TranslateMessage,OFFSET MSG
INVOKE DispatchMessageA,OFFSET MSG
JMP MSG_LOOP
END_LOOP:
Функция TranslateAccelerator. Первым параметром этой функции идет дескриптор приложения, вторым параметром идет дескриптор таблицы акселераторов, получаемый при загрузке таблицы с помощью функции LoadAccelerators. Третий параметр - адрес, где содержится сообщение, полученное функцией GetMessage. [1]