Приложения также могут определять собственные сообщения

  • Первый способ пригоден только для случая, если сообщение пересылается между окнами (частями) одного и того же приложения. Для этого необходимо определить символическое имя нового сообщения при помощи директивы #define, например:
#define СимволическоеИмяОдногоСообщения (WM_USER+1) #define СимволическоеИмяДругогоСообщения (WM_USER+2)
  • Вторым способом определения собственного сообщения является использование функции 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, или выбирается пиктограмма закрытия окна. При поступлении этого сообщения окно разрушается и приложение заканчивает работу.