Операционная система Microsoft Windows 3.1 для программиста -том 3

         

Изменения в цикле обработки сообщений


Для использования акселераторов цикл обработки сообщений должен выглядеть следующим образом:

while(GetMessage(&msg, 0, 0, 0)) { if(!haccel !TranslateAccelerator(hwnd, haccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }

В этом фрагменте кода переменная haccel содержит идентификатор загруженной таблицы акселераторов. Если идентификатор не равен NULL, вызывается функция TranslateAccelerator . Эта функция ищет в очереди сообщений сообщения от клавиатуры, соответствующие определенным в ресурсах приложения акселераторам, преобразуя такие сообщения в сообщения WM_COMMAND и WM_SYSCOMMAND (если сообщение соответствует системному меню), передаваемые непосредственно в функцию окна, минуя очередь сообщений приложения .

Содержимое параметра wParam в последних двух сообщениях равно идентификатору, указанному в таблице акселераторов для данной комбинации клавиш.

Старшее слово параметр lParam содержит 1 для сообщений, которые пришли от акселераторов и 0 для сообщений, которые пришли от меню.

Приведем прототип функции TranslateAccelerator:

int WINAPI TranslateAccelerator(HWND hwnd, HACCEL haccel, MSG FAR* lpmsg);

Параметр hwnd определяет идентификатор окна, для которого выполняется преобразование клавиатурных сообщений.

Параметр haccel должен содержать идентификатор загруженной при помощи функции LoadAccelerators таблицы акселераторов.

Последний параметр lpmsg является указателем на структуру типа MSG, в которую должно быть записано обрабатываемое сообщение.

Если функция TranslateAccelerator выполнила преобразование сообщения, она возвращает ненулевое значение. В противном случае возвращается0. Обработанное сообщение не следует передавать функциям TranslateMessage и DispatchMessage.



Содержание раздела