Russian Belarusian English German Japanese Ukrainian

Обработка сообщений в приложениях

CuBook25

Некоторые функции API Windows позволяют работать с окнами. Все они неявно использовали различные сообщения Windows. Но взаимодействие с другими приложениями, выполняющимися одновременно с вашим, может быть и явным образом организовано с помощью сообщений Windows.
Приложения Windows состоят из множества объектов, которые взаимодействуют друг с другом, обмениваясь сообщениями (messages). Источниками этих сообщений могут быть: пользователь, оперирующий с клавиатурой и мышью, среда Windows, посылающая сообщения приложениям, другие приложения, обменивающиеся информацией с вашим приложением и, наконец, ваше приложение, посылающее сообщения компонентам.
 
Большинство сообщений, которые вам могут потребоваться, C++Builder обрабатывает сам, так что вам достаточно использовать обработчики стандартных событий компонентов. Но иногда вам может потребоваться самому обрабатывать сообщения Windows. Такая необходимость возникает, если нужное вам сообщение пока еще компонентами C++Builder не обрабатывается, или если вы определили свое собственное сообщение.
 
Сообщение Windows представляет собой структуру TMessage, содержащую поля. Наиболее важное из них - Msg содержит целое значение, идентифицирующее данное сообщение. В модуле Messages.hpp в C++Builder содержатся объявления множества идентификаторов, позволяющие оперировать с мнемоническими именами сообщений, а не с какими-то целыми значениями. Важная информация о сообщении содержится также в двух полях параметров - wParam (word parameter - параметр типа word) и lParam (long parameter - параметр типа long) и в поле результата Result. Впрочем, реально в C++Builder все эти поля имеют тип int. Каждое из них может быть также представлено как комбинация двух полей типа Word: WParamLo, WParamHi, LParamLo, LParamHi, ResultLo, ResultHi. В этих именах окончание «Hi» относится к старшим разрядам соответствующего параметра, а окончание «Lо» - к младшим разрядам.
 
В API Windows и в C++Builder для большинства сообщений введены мнемонические имена параметров. Так что теперь, например, при обработке сообщения от мыши можно ссылаться на понятные параметры XPos и YPos, а не на стандартные и ни о чем не говорящие имена lParamLo и lParamHi.
В Windows предусмотрено множество сообщений. Для дальнейших экспериментов нам потребуется только два сообщения. Первое из них WM_CLOSE, сигнализирующее, что окно или приложение закрывается. Это сообщение не имеет параметров. По умолчанию оно уничтожает окно, которому послано. Если приложение обрабатывает это сообщение, то оно должно возвращать нуль.
 
При обработке данного сообщения приложение может запросить пользователя о необходимости закрывать окно и вызвать функцию закрытия окна только при положительном ответе.
Второе сообщение, которое мы будем использовать - WM_ACTIVATE. Оно посылается, когда окно переводится в активное или неактивное состояние. Сначала сообщение посылается окну, переходящему в неактивное состояние, а потом - активируемому.
Это сообщение определено следующим образом:
WM_АСТIVATE
fActive = LOWORD(wParam);
fMinimized = (BOOL) HIWORD(wParam);
hwndPrevious = (HWND) lParam;
Параметр fActive показывает, как активируется или деактивируется окно. Возможные значения параметра:
Значение Описание
WA_ ACTIVE Окно активируется не щелчком мыши (например, функцией SetActiveWindow или клавиатурой).
WA_CLICK ACTIVE Окно активируется щелчком мыши.
WA_IN ACTIVE Окно деактивируется.
Параметр fMinimized показывает, свернуто окно, или нет. Ненулевое значение соответствует свернутому окну.
 
Параметр hwndPrevious - это дескриптор, который указывает на окно, из которого фокус переключился на данное окно, если оно активируется, или на окно, в которое передается управление, если данное окно деактивируется. По умолчанию, если активируемое окно не свернуто, то оно получает фокус. Если приложение обрабатывает это сообщение, то оно должно возвращать нуль.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий