92978b58

Передача сообщений функции окна


Общепринятый способ взаимодействия окон в системе Presentation Manager основан на передаче сообщений . Конкретнее, функция main или обработчик сообщения функции любого окна может послать сообщение другому окну. При этом передаваемое сообщение попадет в функцию этого окна.

Существует два принципиально разных способа передачи сообщений - передача через очередь приложения и непосредственная передача.

Передача сообщений через очередь приложения выполняется функцией WinPostMsg , прототип которой приведен ниже:

BOOL WinPostMsg ( HWND hwnd, // идентификатор окна ULONG ulMsgid, // код сообщения MPARAM mpParam1, // первый параметр MPARAM mpParam2); // второй параметр

Функция WinPostMsg посылает сообщение в функцию окна с идентификатором hwnd, причем код передаваемого сообщения определяется параметром ulMsgid, а первый и второй параметры сообщения - параметрами mpParam1 и mpParam2, соответственно.

Процедура посылки сообщения при помощи функции WinPostMsg выглядит следующим образом: функция записывает сообщение в очередь приложения и сразу же возвращает управление, не дожидаясь завершения обработки переданного сообщения. Если сообщение записано в очередь, функция WinPostMsg возвращает значение TRUE. В том случае, когда сообщение невозможно записать в очередь (например, по причине ее переполнения), функция возвращает значение FALSE.

Второй способ передачи сообщений основан на использовании функции WinSendMsg , прототип которой аналогичен прототипу функции WinPostMsg :

BOOL WinSendMsg ( HWND hwnd, // идентификатор окна ULONG ulMsgid, // код сообщения MPARAM mpParam1, // первый параметр MPARAM mpParam2); // второй параметр

Вызов функции WinSendMsg приводит к тому, что Presentation Manager выполняет непосредственный вызов функции окна, идентификатор которого задан параметром hwnd. При этом функции окна передается сообщение с кодом ulMsgid и параметрами mpParam1, mpParam2.

В отличие от функции WinPostMsg , функция WinSendMsg возвращает управление только после того, как передаваемое сообщение будет обработано соответствующей функцией окна.
При этом она возвращает то значение, которое было передано через оператор return обработчиком сообщения при возврате управления из функции окна.

Ниже мы привели фрагмент исходного текста приложения, в котором окну hWndChildFrame передается сообщение WM_SETICON :

WinSendMsg (hWndChildFrame, WM_SETICON , (MPARAM)WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE), NULL);

Первый параметр этого сообщения равен значению, полученному от функции WinQuerySysPointer (подробнее эту функцию мы рассмотрим позже), второй равен NULL.

Функция WinBroadcastMsg позволяет передавать сообщения одним из двух описанных выше методов одновременно всем дочерним окнам любого родительского окна:

BOOL WinBroadcastMsg ( HWND hwnd, // идентификатор родительского окна ULONG ulMsgid, // код сообщения MPARAM mpParam1, // первый параметр MPARAM mpParam2, // второй параметр ULONG flCmd); // команда

В зависимости от значения параметра flCmd функция WinBroadcastMsg использует различный способ передачи сообщения дочерним окнам. Ниже мы привели список возможных значений для этого параметра.



Значение Описание
BMSG_POST Передача сообщения через очередь сообщения. Этот параметр несовместим с параметрами BMSG_SEND и BMSG_POSTQUEUE
BMSG_SEND Непосредственная передача сообщения. Этот параметр несовместим с параметрами BMSG_POST и BMSG_POSTQUEUE
BMSG_POSTQUEUE Передача сообщения всем задачам процесса, имеющим очередь сообщений. Этот параметр несовместим с параметрами BMSG_POST и BMSG_SEND
BMSG_DESCENDANTS Сообщение передается всем дочерним окнам родительского окна hwnd
BMSG_FRAMEONLY Сообщение передается только окнам, имеющим стиль CS_FRAME (только окнам Frame Window )
В случае успешного завершения функция WinBroadcastMsg возвращает значение TRUE, при ошибке - FALSE.

Еще одна функция, которую мы рассмотрим в этом разделе, называется WinPostQueueMsg . Она позволяет записывать сообщение в заданную очередь сообщений:

BOOL WinPostQueueMsg ( HMQ hmq, // идентификатор очереди сообщений ULONG ulMsgid, // код сообщения MPARAM mpParam1, // первый параметр MPARAM mpParam2); // второй параметр

Обратите внимание, что этой функции не передается идентификатор окна.


Содержание раздела