Приложения также могут определять собственные сообщения.
- Первый способ пригоден только для случая, если сообщение пересылается между окнами (частями) одного и того же приложения. Для этого необходимо определить символическое имя нового сообщения при помощи директивы #define, например:
- Вторым способом определения собственного сообщения является использование функции RegisterWindowMessage, которая возвращает уникальный идентификатор для сообщения. Использование собственных типов сообщений, полученных таким способом, позволяет частям приложения связываться между собой; разные приложения также могут обмениваться информацией таким способом. Однако для взаимодействия приложений доступны более мощные механизмы, например, отображаемые в память файлы.
Цикл обработки сообщений:
MSG msg; while(GetMessage(&msg,0,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } |
Рассмотрим функцию GetMessage():
BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax ); |
Функция GetMessage() извлекает сообщение из очереди сообщений и помещает его в структуру lpMsg типа MSG. Если сообщений в очереди нет, то текущий поток переводится в состояние ожидания и досрочно отдает управление другим потокам.
Возвращаемое значение:
Если функция извлекает сообщение отличное от WM_QUIT, то функция возвращает ненулевое значение. Если функция извлекает сообщение WM_QUIT, то она возвращает 0.
Если произошла ошибка, то функция возвращает -1.
- lpMsg - указатель на структуру куда будет помещено сообщение;
- hWnd - хэндл окна для которого извлекается сообщение, если указать 0, то функция GetMessage() будет извлекать сообщения для всех окон;
- wMsgFilterMin - нижняя граница диапазона извлечения, например, если указать 10, то будут извлекаться сообщения с кодами сообщений начиная с 10, если указать ноль, то граница отсутствует;
- wMsgFilterMax - верхняя граница диапазона извлечения, например, если указать 300, то будут извлекаться сообщения с кодами сообщений до 300, если указать ноль, то граница отсутствует.
Рассмотрим функцию TranslateMessage():
BOOL TranslateMessage(CONST MSG *lpMsg); |
Функция TranslateMessage() транслирует сообщения от клавиатуры. Она переводит сообщения виртуальных клавиш (Virtual-key) в символьные сообщения.
Рассмотрим функцию DispatchMessage():
LONG DispatchMessage(CONST MSG *lpmsg); |
Функция DispatchMessage() отправляет сообщение в оконную процедуру. По сути эта функция и вызывает оконную процедуру.
Наше приложение обрабатывает всего три сообщения:
1. WM_LBOTTONDOWN - нажата левая кнопка мыши
2. WM_PAIN – окно требует перерисовки
3. WM_DESTROY - передастся при завершении работы приложения. Когда нажимается комбинация клавиш Alt+F4 , или в системно меню выбирается команда Close, или выбирается пиктограмма закрытия окна. При поступлении этого сообщения окно разрушается и приложение заканчивает работу.
Дата добавления: 2017-01-26; просмотров: 1129;