Оконная функция – функция обратного вызова


Программисты хорошо знакомы с понятием вызова операционной системы для выполнения каких-то действий. Например, программисты на C используют функцию fopen для открытия файла. Библиотечные функции, поставляемые компилятором, содержат код, который фактически вызывает для открытия файла операционную систему. Здесь все просто. Но операционная система Windows ведет себя иначе.

Хотя в Windows имеется очень много доступных программисту функций, Windows также и сама посылает вызовы программе, особенно оконной процедуре. Оконная процедура связана с классом окна, который программа регистрирует с помощью вызова функции RegisterClass. Окно, создаваемое на основе этого класса, использует оконную процедуру для обработки всех сообщений окна. Windows посылает сообщения окну, вызывая оконную процедуру.

Рассмотрим примеры, когда Windows вызывает оконную процедуру:

  • первый раз при создании окна;
  • при последующем удалении окна;
  • при изменении размеров окна, при его перемещении, при его свертывании;
  • при выборе пункта меню;
  • при манипуляции с полосами прокрутки или с мышью;
  • чтобы сообщить ей о необходимости перерисовать рабочую область.

Все эти вызовы имеют форму сообщений. В большинстве Windows-программ основная часть программы направлена на обработку этих сообщений. Свыше 200 различных сообщений, которые Windows может отправить оконной процедуре, идентифицируются именами, которые начинаются с cимволов WM_ и определяются в заголовочных файлах Windows.

Фактически, идея функции, находящейся в программе, но которая вызывается не из самой программы, не является абсолютно новой в традиционном программировании. Функции signal в языке С может перехватить нажатие комбинации клавиш <Ctrl+Break>. В Windows эта идея расширена и пронизывает всю систему.

Любое событие, относящееся к окну, передается оконной процедуре в виде сообщения. Затем оконная процедура соответствующим образом реагирует на это сообщение или передает сообщение в функцию DefWindowProcдля обработки его по умолчанию.

Цикл обработки сообщений и оконная процедура работают не параллельно. Когда оконная процедура обрабатывает сообщение, то это результат вызова функции DispatchMessage в WinMain. DispatchMessage не завершается до тех пор, пока оконная процедура не обработала сообщение.

Часто возникает необходимость того, чтобыоконная функция сохраняла информацию, полученную в сообщении, и использовала ее при обработке другого сообщения. Тогда эту информацию следует описывать в оконной процедуре в виде статических переменных, либо хранить в глобальных переменных.

Функция окна должна иметь следующий прототип (имя этой функции может быть произвольным ):



Дата добавления: 2017-01-26; просмотров: 1149;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.