NOINVERT, ALT, CONTROL і SHIFT. Зазвичай при використанні акселераторних комбінацій меню відображається так, немов ми вибрали команду звичайним способом.
NOINVERT означає, що при використанні акселератора зовнішнє меню на введення команди ніяк не відреагує, навіть якщо буде активно і відображує.
ALT вказує, що для отримання акселераторной комбінації одночасно з вказаною клавішею необхідно натиснути клавішу Alt.
CONTROL говорить про те, що одночасно з клавішею повинна натискатися клавіша Control.
SHIFT вимагає одночасного з клавішею натискання Shift.
В якості клавіші можна вказати:
її символ в лапках,
код ASCII-символу,
код віртуальної клавіші, визначеної у файлах заголовків.
При використанні ASCII-коду в якості типу має бути зазначено ASCII, а в разі застосування віртуальної клавіші тип повинен бути VIRTKEY.
Віртуальна клавіша - це системно-незалежний код, визначений для основного набору службових клавіш. Цей набір включає клавіші F1-F12, стрілки і т.д. Коди віртуальних клавіш визначені в заголовних файлах. Всі їх ідентифікатори починаються з літер VK (Virtual Key). Різниця між віртуальною клавішею і ASCII-символом з точки зору користувача полягає в тому, що віртуальні клавіші не розрізняють великих і малих літер, на відміну від ASCII-символів.
При визначенні акселераторів можна піти на невелику хитрість. Уявімо собі, що в якості акселератора ми вказали велику літеру і, скажімо, ALT. У цьому випадку нам доведеться одночасно натискати три клавіші - букву, клавішу SHIFT (необхідно зробити символ заголовним!) і клавішу Alt. Таким чином, за умов згадування в якості основної клавіші великої літери, можна визначати трехклавішние акселератори. До речі, якщо ми хочемо, щоб для виклику команди використовувалася клавіша Control, то можна символ в лапках випередити знаком ^.
Прикладами акселераторів у файлі ресурсів можуть служити такі записи:
"a", IDM_The_First_Item, ALT// визначається комбінація Alt-a
"A", IDM_The_Second_Item, ALT// визначається комбінація Shift-Alt-a
Таблиця акселераторів повинна бути завантажена в пам'ять після створення вікна до початку роботи з меню. Тому бажано виклик функції LoadAccelerator (), здійснює завантаження таблиці акселераторів, вставити в текст програми відразу ж після створення вікна. Синтаксис функцій наступний:
HACCEL LoadAccelerators (HINSTANCE hInst, LPCTSTR lpszTableName)
Параметри:
hInst - хендл додатки, в яке завантажується растрове зображення;
lpszTableName - покажчик на рядок з нульовим символом в кінці, яка містить ім'я завантажується.
, що повертається: при успішному виконанні - хендл завантаженої таблиці оперативних клавіш, інакше - NULL. p> Кожне натискання акселераторной комбінації повинно генерувати повідомлення WM_COMMAND. Для цього акселератори і створювалися. Тому, навіть після завантаження таблиці в пам'ять програма не зможе на них правильно реагувати, якщо ми не будемо використовувати функцію TranslateAccelerator (), Яка перетворює повідомлення від клавіатури в повідомлення WM_COMMAND. Опис цієї функції:
int TranslateAccelerator (HWND hWnd, HACCEL hAccTable, LPMSG lpMsg)
Параметри:
hWnd - хендл вікна з функцією обробки повідомлень (WndProc), яка повинна приймати перетворені повідомлення;
hAccTable - хендл таблиці оперативних клавіш.
lpMsg - покажчик на структуру повідомлення, яка містить дані повідомлення, отримані при виклику функції GetMessage (). p>, що повертається: при успішному виконанні - ненульове значення, якщо натиснута акселераторная комбінація, інакше - нуль.
Тому, з урахуванням виклику цієї функції цикл обробки повідомлень повинен виглядати наступним чином:
while (GetMessage (& Msg, NULL, 0, 0))
{
if (! Accel | |! TranslateAccelerator (hWnd, hAcc, & msg);
{
TranslateMessage (& Msg);
DispatchMessage (& Msg);
}
}