Top.Mail.Ru
Ответы

Помогите с вопросом по с++

Что такое цикл обработки сообщений? Что такое сообщение?

По дате
По рейтингу
Аватар пользователя
Ученик

Вот читайте гайд от самих разработчиков Windows

https://learn.microsoft.com/ru-ru/windows/win32/learnwin32/learn-to-program-for-windows

Аватар пользователя
Просветленный

Цикл обработки сообщений и понятие сообщения часто встречаются в контексте программирования графических пользовательских интерфейсов (GUI), особенно в таких средах, как Windows API.

Цикл обработки сообщений
Цикл обработки сообщений (message loop) — это механизм, который используется в графических приложениях для обработки событий, таких как нажатие клавиш, перемещение мыши, и другие действия пользователя. В Windows API это основной механизм для управления событиями.

Цикл обработки сообщений выполняется в основном потоке приложения и обычно выглядит так:

1234567
 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:

12345678
 typedef struct tagMSG { 
    HWND   hwnd; 
    UINT   message; 
    WPARAM wParam; 
    LPARAM lParam; 
    DWORD  time; 
    POINT  pt; 
} MSG, *PMSG;  

Когда пользователь, например, нажимает клавишу или перемещает мышь, система генерирует соответствующее сообщение и помещает его в очередь сообщений приложения. Цикл обработки сообщений извлекает это сообщение и передает его на обработку оконной процедуре, которая затем выполняет соответствующие действия.