Цикл обработки сообщений и понятие сообщения часто встречаются в контексте программирования графических пользовательских интерфейсов (GUI), особенно в таких средах, как Windows API.
Цикл обработки сообщений
Цикл обработки сообщений (message loop) — это механизм, который используется в графических приложениях для обработки событий, таких как нажатие клавиш, перемещение мыши, и другие действия пользователя. В Windows API это основной механизм для управления событиями.
Цикл обработки сообщений выполняется в основном потоке приложения и обычно выглядит так:
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage(&msg, nullptr, 0, 0): Функция извлекает сообщение из очереди сообщений текущего потока. Она блокируется до тех пор, пока сообщение не появится в очереди.
TranslateMessage(&msg): Функция, которая обрабатывает некоторые сообщения, например, преобразует нажатия клавиш в символы.
DispatchMessage(&msg): Функция передает сообщение соответствующей оконной процедуре (функции окна), которая затем обрабатывает это сообщение.
Сообщение
Сообщение (message) — это структура данных, которая описывает событие, произошедшее в системе. В Windows API сообщение представляется структурой MSG, которая включает в себя:
HWND hwnd: Идентификатор окна, которому предназначено сообщение.UINT message: Код сообщения, определяющий тип события (например, нажатие клавиши, движение
HWND hwnd: Идентификатор окна, которому предназначено сообщение.
UINT message: Код сообщения, определяющий тип события (например, нажатие клавиши, движение мыши).
WPARAM wParam: Дополнительная информация, зависящая от типа сообщения.
LPARAM lParam: Дополнительная информация, зависящая от типа сообщения.
DWORD time: Время, когда сообщение было отправлено.
POINT pt: Координаты курсора мыши в момент отправки сообщения.
Cтруктура MSG:
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
Когда пользователь, например, нажимает клавишу или перемещает мышь, система генерирует соответствующее сообщение и помещает его в очередь сообщений приложения. Цикл обработки сообщений извлекает это сообщение и передает его на обработку оконной процедуре, которая затем выполняет соответствующие действия.