Макросы – распаковщики сообщений
#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 или любая другая функция, имеющая аналогичный набор параметров.
Ниже приведена модифицированная функция окна из рассмотренного нами ранее примера, а также соответствующие функции-обработчики сообщений. Предлагаем читателю самостоятельно разобраться с использованием распаковщиков сообщений в этом примере.
предыдущаяследующая