![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Загрузка таблицы акселераторов
Хотя акселераторы определены в том же файле ресурсов, что и меню, они должны быть отдельно загружены при помощи функции API LoadAccelerators(), которая имеет следующий прототип: HACCEL LoadAccelerators (HINSTANCE ThisInst, LPSTR Name); ThisInst – это дескриптор текущего экземпляра приложения, a Name – имя таблицы акселераторов. Функция возвращает дескриптор загруженной таблицы акселераторов либо NULL, если таблица не может быть загружена. Функцию LoadAccelerators() нужно вызывать сразу после создания окна. Например, таблица акселераторов для MYMENU загружается так: HACCEL hAccel; ... hAccel=LoadAccelerators(hThisInst, " Mymenu"); Значение hAccel будет использовано позже для обработки акселераторных комбинаций. Несмотря на то, что функция LoadAccelerators() загружает таблицу акселераторов, программа не будет обрабатывать их до тех пор, пока Вы не добавите в цикл обработки сообщений еще одну функцию API. Эта функция называется TranslateAccelerator(): int TranslateAccelerator (HWND hwnd, HACCEL hAccel, LPMSG lpMess); Здесь hwnd является дескриптором окна, для которого должны транслироваться акселераторные комбинации, hAccel – дескриптором таблицы акселераторов, возвращаемым функцией LoadAccelerators(), и наконец, lpMess – указателем на сообщение. Функция TranclateAccelerator() возвращает ненулевое значение, если была использована акселераторная комбинация, и нулевое – в противном случае. Таким образом, эта функция транслирует акселераторы в соответствующие сообщения WM_COMMAND. С использованием функции TranslateAccelerator() цикл обработки сообщений будет выглядеть так:
while(GetMessage(& msg, NULL, 0, 0)) { if(! TranslateAccelerator(hwnd, hAccel, & msg)) { TranslateMessage(& msg); // Использовать клавиатуру DispatchMessage (& msg); // Вернуть упр. к Windows } }
Пример 4-3. Попробуйте использовать акселераторы, подставив в предыдущий пример приведенную ниже версию WinMain() и добавив в файл ресурсов таблицу акселераторов:
// Обработка акселераторов #include < Windows.h> #include < String.h> #include < Stdio.h> #include " Menu.h"
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); char szWinName[]=" МоеОкно"; // Имя класса окна
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { HWND hwnd; MSG msg; HACCEL hAccel; // Для обработки акселераторов WNDCLASS wcl; // Определить класс окна wcl.hInstance=hThisInst; // Дескриптор приложения wcl.lpszClassName=szWinName; // Имя класса окна wcl.lpfnWndProc=WindowFunc; // Функция окна wcl.style=0; // Стиль по умолчанию wcl.hIcon=LoadIcon(NULL, IDI_APPLICATION); // Иконка wcl.hCursor=LoadCursor(NULL, IDC_ARROW); // Курсор wcl.lpszMenuName=" Mymenu"; // Главное меню wcl.cbClsExtra=0; // Без дополнительной информации wcl.cbWndExtra=0; wcl.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон if(! RegisterClass(& wcl)) // Регистрируем класс окна return 0; hwnd=CreateWindow(szWinName, // Создать окно " Обработка команд меню", WS_OVERLAPPEDWINDOW, // Стиль окна CW_USEDEFAULT, // x-координата CW_USEDEFAULT, // y-координата CW_USEDEFAULT, // Ширина CW_USEDEFAULT, // Высота HWND_DESKTOP, // Нет родител. окна NULL, // Нет меню hThisInst, // Дескриптор приложения NULL); // Нет дополнит. аргументов hAccel=LoadAccelerators(hThisInst, " Mymenu"); // Загрузить акселераторы ShowWindow (hwnd, nWinMode); // Показать окно UpdateWindow (hwnd); // и перерисовать
while(GetMessage(& msg, NULL, 0, 0)) { if(! TranslateAccelerator(hwnd, hAccel, & msg)) { TranslateMessage(& msg); // Использ. клавиатуру DispatchMessage (& msg); // Вернуться. к Windows } } return msg.wParam; }
Прежде чем следовать дальше, поэкспериментируйте со своими собственными окнами сообщений, меню и аксел00ераторами. Попробуйте различные варианты и посмотрите, что получится. Меню и окна сообщений будут часто использоваться в настоящей книге, поэтому важно четко понимать, как работают эти элементы.
|