Макросы – распаковщики сообщений
В файле windowsx.h системы программирования Borland C++ 5.01 определены макросы– распаковщики сообщений, упрощающие обработку сообщений в функции окна. Как уже отмечалось выше, функция окна фактически представляет собой огромный оператор switch, который может занимать не одну сотню строк исходного текста. Написание подобных операторов противоречит принципам структурного программирования и может приводить к трудно обнаруживаемым ошибкам. Второй серьезной трудностью при программировании функции окна является необходимость обработки параметров сообщений, смысл которых меняется от сообщения к сообщению. Более того, возможно изменение смысла параметров одного и того же сообщения при переходе к новым версиям Windows, как это, например, произошло с параметрами сообщения WM_COMMAND при переходе от WIN16 к WIN32.
20
Легко обойти все эти трудности позволяют распаковщики сообщений. Рассмотрим некоторые из них.
Макрос HANDLE_MSG определен следующим образом :
#define HANDLE_MSG(hwnd, message, fn) \
case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
Вот как в случае сообщения WM_LBUTTONDOWN после обработки препроцессоромбудет выглядеть строка HANDLE_MSG(hwnd, WM_LBUTTONDOWN, Cls_OnLButtonDown) :
case (WM_LBUTTONDOWN):
return HANDLE_WM_LBUTTONDOWN((hwnd), (wParam), (lParam), (Cls_OnLButtonDown));
Таким образом, макрос HANDLE_MSG применяется в функции окна и назначает обрабатываемому сообщению отдельную функцию – обработчик.
Макросы HANDLE_WM* непосредственно вызывают указанную функцию, после чего производится возврат из функции окна. Вот как, например, определен макрос HANDLE_WM_LBUTTONDOWN:
предыдущаяследующая