Обработчик событий — это функция, которую вы пишете сами и регистрируете в системе вместе с окном приложения. После регистрации вашего обработчика событий каждое сообщение переданное функцией DispatchMessage попадет к вашему обработчику. Типичный обработчик событий содержит инструкцию switch с инструкциями case для каждого события, которое необходимо обработать. События, которые не нуждаются в специальной обработке, обычно передаются внутреннему обработчику событий системы Windows. Простейший обработчик событий выглядит следующим образом:
long WINAPI WndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam) { switch (msg) { case WM_KEYDOWN: // Здесь располагается код для обработки нажатия клавиши break; case WM_MOUSEMOVE: // Здесь располагается код для обработки перемещения мыши break; default: // Если событие не нуждается в обработке, передадим // его системе Windows return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }
Конструкция обработчика событий мощная и полезная, потому что позволяет вам перехватывать сообщения до того, как они будут обработаны системой Windows. Вы можете задать реакцию на любое событие, проходящее через ваш обработчик, добавив в текст программы соответствующую инструкцию case.
С другой стороны, очевидно, что обработка каждого возможного сообщения в одной функции, приводит к появлению уродливого кода. Типичные программы для Windows (включая примеры программ, входящие в комплект поставки DirectX) часто содержат массивные обработчики событий, занимающие сотни строк программы. Альтернативой является написание отдельной функции обработки для каждого события и последующий вызов этой функции из обработчика событий. Этот вариант предпочтительней, поскольку позволяет вам писать набор маленьких обработчиков для отдельных событий, вместо одной огромной сложной программы, обрабатывающей все события. MFC использует именно такую технику с одним существенным усовершенствованием, называемым карты сообщений.