Windows API Урок 25. Добавляем акселератор
Акселератор - это некоторая комбинация клавиш, которая дублирует команду (скажем, команду меню). Например, для некоторого меню вы можете создать акселератор Ctrl+D - это означает, что и при выборе этого пунтка меню мышкой и при нажатии комбинации клавиш Ctrl+D будет производится одно и то же действие.
Для создания акселератора вы должны сделать следующие действия: создать таблицу акселераторов через API-функцию CreateAcceleratorTable. Далее мы должны в цикле while, обрабатывающем сообщения Windows, вызвать API-функцию TranslateAccelerator, которая переводит сообщения от нажатых клавиш в WM_COMMAND (или в WM_SYSCOMMAND). И, наконец, в соответствующем месте мы должны уничтожить созданную таблицу акселераторов путем вызова API-функции DestroyAcceleratorTable.
Теперь практическая часть урока. А качестве основы возьмем программу с меню, написанную на прошлом уроке.
Шаг первый - создание таблицы акселераторов:
HACCEL CreateAccelerators()
{
// Массив акселераторов.
ACCEL acc[1];
// Задаем акселератор команды.
// Идентификатор команды.
acc[0].cmd = 1001;
// Определяем клавишу-модификатор (Ctrl).
acc[0].fVirt = FVIRTKEY|FCONTROL;
// Определяем клавишу.
acc[0].key = 0x4e;
// Создаем таблицу акселераторов.
return CreateAcceleratorTable((LPACCEL)acc, 1);
}
Этот кусок кода можно вставить, например, после include в самом начале программы. В этом фрагменте у нас только один акселератор (в массиве только один элемент). Для акселератора мы должны определить идентификатор команды и комбинацию клавиш, по которой команда будет вызываться. Тут мы определили, что наша команда с идентификатором 1001 будет вызываться по Ctrl+N.
Следующий шаг изменение функции WinMain. Тут мы делаем вызов только что определеной функции CreateAccelerators, изменяем цикл while и уничтожаем таблицу акселераторов:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
...
// Создание таблицы акселераторов.
HACCEL hAccel = CreateAccelerators();
while(GetMessage(&msg,NULL,0,0))
{
// Перевод сообщения от нажатых клавиш в WM_COMMAND.
if(!(hAccel && TranslateAccelerator(hwnd, hAccel, &msg)))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// Уничтожение таблицы акселераторов.
DestroyAcceleratorTable(hAccel);
return msg.wParam;
}
Собственно говоря, все. Можно компилировать и запускать программу. Теперь наш messagebox будет появляться не только при выборе соответствующего пункта меню, но и при нажатии Ctrl+N.
|