Cтраница 1
Оконная процедура получает сообщения, инициируемые тремя частями аппаратного обеспечения: клавиатурой, мышью и системным таймером. Все они генерируют аппаратные прерывания. Поскольку диспетчеризация Windows не действует в режиме прерываний, аппаратные события должны быть буферизованы. Это обеспечивает обработку событий в порядке их поступления. Например, когда вы нажимаете клавишу К, прерывание уведомляет систему о том, что приготовлены данные от клавиатуры. Драйвер клавиатуры отыскивает эти данные и создает элемент в первичной очереди, откуда система их передает в очередь приложения, точнее, конкретного потока. Когда наступает очередь сообщения, содержащего информацию о клавише К, оно направляется в соответствующую оконную процедуру. Сообщения от мыши и системного таймера обрабатываются аналогично. Далее представлены основные сообщения, которые формируются как реакция на сообщения от аппаратного обеспечения. [1]
![]() |
Панель меню приложения MdiMuIti автоматически отражает наличие различных дочерних окон. Сравните с. [2] |
Оконная процедура - это функция, которая получает все сообщения окна. Каждое окно должно иметь такую процедуру, и она должна быть единственной. Даже Delphi-формы имеют процедуру окна; хотя это скрывается в системе, вызывается виртуальная функция WndProc, которую тоже можно использовать. Однако VCL имеет предопределенный обработчик для этих сообщений, который пересылает их методам обработки сообщений формы. Вам необходимо лишь явно обработать оконную процедуру, а затем работать с не - Delphi окнами, как в данном случае. [3]
Оконная процедура представляет собой код, исполняемый каждый раз, когда конфигурированный управляющий элемент должен обрабатывать сообщение. [4]
Устанавливаемая оконная процедура вызывает стандартную процедуру. [5]
Адрес новой оконной процедуры передается в Windows, а адрес старой сохраняется. [6]
При рассмотрении оконной процедуры говорилось, что поступающие в нее сообщения обрабатываются индивидуально. Там же мы упомянули о существовании специального типа функций, каждая из которых отвечает за обработку одного и только одного сообщения. Аналогичный подход реализован и в библиотеке классов MFC, где для обработки каждого отдельного сообщения используется специальная функция-обработчик. Все функции-обработчики являются функциями какого-либо класса, и для них используются названия: функция-член обработчик сообщения, функция обработчик сообщения или просто обработчик сообщения. Принципы работы обработчиков сообщений не изменяются от того, к какой категории относится сообщение, однако механизмы их вызова различны. Но прежде чем рассматривать механизмы посылки и получения сообщений, необходимо понять, каким образом сопоставляются сообщение и соответствующий ему обработчик. [7]
Сообщение-уведомление говорит оконной процедуре о том, что состояние окна было изменено. При этом оконная процедура вовсе не должна выполнять действие, обозначенное именем сообщения. Например, сообщение WM MOVE не является запросом на некоторое перемещение. Наоборот, оно является сообщением после действия, и напоминает, что окно уже было перемещено. Обратите внимание, что из сообщения не ясно, каким образом произошло перемещение. Это могло быть результатом действий пользователя, равно как и другой программы. В любом случае, сообщения-уведомления представляют собой одностороннюю связь с оконной процедурой. [8]
Прежде чем будет вызвана оконная процедура обработки сообщений по умолчанию, WndProc может сама ответить на большинство из них. CPP - пример минимальной программы для Windows, поэтому здесь необходимо ответить только на сообщение, говорящее о том, что главное окно собирается закрыться. [9]
Функция PostMessage не вызывает явно оконную процедуру, а пересылает сообщение в очередь сообщений приложения. Каждое приложение имеет очередь сообщений, которая по умолчанию вмещает до восьми сообщений. Сообщения выбираются из очереди с помощью функции GetMessage. Из рассмотрения функции WinMain программы FonsExp видно, что после вызова GetMessage сообщение передается оконной процедуре с помощью функции DispatchMessage. [10]
Пользователь должен позаботиться об оконной процедуре для фрейма, но не для рабочего окна. [11]
Их обработка осуществляется в соответствующей оконной процедуре. [12]
Каждое сообщение, посылаемое в оконную процедуру, является важным. [13]
Теперь, когда вы изучили оконную процедуру и основы вывода текста, приступим к знакомству с более сложными темами, такими, как мышь и клавиатура. С помощью системы сообщений можно установить немедленный и относительно полный контроль Над этими двумя устройствами. [14]
После того как FileBox заменит оконную процедуру, которую она столь бесцеремонно позаимствовала, последний шаг состоит в том, чтобы уничтожить окно, которое она создала. [15]