Электронный учебник:


Курс лекций:


Дополнительно:

Практикум:



Наши хостеры:

двуспальные кровати каталог

--------------------------

Макросы – распаковщики сообщений

#define HANDLE_WM_LBUTTONDOWN(hwnd, wParam, lParam, fn) \

((fn)((hwnd), FALSE, (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam),              (UINT)(wParam)), 0L)

Результатом раскрытия препроцессором любого из макросов HANDLE_WM_* является вызов функции Cls_On*, которой передаются после соответствующих преобразований типов распакованные части параметров wParam и lParam. Чтобы использовать распаковщик для обработки сообщения следует найти в файле windowsx.h макрос HANDLE_WM* для сообщения, которое необходимо обработать. В строке-комментарии перед макросом указан прототип функции – обработчика сообщения. В случае WM_LBUTTONDOWN эта строка выглядит следующим образом :

/* void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y,

                           UINT keyFlags) */

            Макросы FORWARD_WM* решают обратную задачу – принимают распакованные параметры сообщения, воссоздают  по ним исходные параметры wParam и lParam, а затем вызывают функцию, указанную в качестве последнего параметра макроса, передавая ей воссозданные параметры. Вот как это выглядит в случае сообщения WM_LBUTTONDOWN:

#define FORWARD_WM_LBUTTONDOWN(hwnd, fDoubleClick, x, y, keyFlags, fn) \

(void)(fn)((hwnd), (fDoubleClick) ? WM_LBUTTONDBLCLK : WM_LBUTTONDOWN,          (WPARAM)(UINT)(keyFlags), MAKELPARAM((x), (y)))

В качестве вызываемой функции может быть DefWindowProc, SendMessage или любая другая функция, имеющая аналогичный набор параметров.

                Ниже приведена модифицированная функция окна из рассмотренного нами ранее примера, а также соответствующие функции-обработчики сообщений. Предлагаем читателю самостоятельно разобраться с использованием распаковщиков сообщений в этом примере.

предыдущаяследующая