Окт 13

Оконная процедура

Для понимания механизма обработки приложением поступающих к нему сообщений сначала нужно объяснить, что такое «оконная процедура».
Оконная процедура — это «функция обратного вызова», предназначенная для обработки сообщений, адресованных любому окну того «оконного класса», в котором содержится ссылка на данную процедуру.
Если вы прочли только что сделанное определение, как говорится, не моргнув глазом, значит, вы — не новичок в программировании для Windows. Для тех же, кто видит эти термины впервые, нужны дополнительные разъяснения.
Начнем с понятия «функция обратного вызова». Так называют функции, которые вызывает сама операционная система. Поэтому в коде приложения вы не найдете прямого вызова такой функции. Компилятор узнает функцию обратного вызова по спецификатору CALLBACK.
В этом определении LRESULT — тип возвращаемого значения (см. табл. 1.1), hWnd — дескриптор окна, которому адресовано сообщение, uMsg — код сообщения, wParam и IParam — параметры сообщения. Имя функции может быть произвольным, но для главного окна приложения обычно используется имя WndProc.
В теле функции после объявления необходимых локальных переменных обычно размещается оператор switch, внутри которого и происходит обработка нужных сообщений.
Каждому коду сообщения в Windows сопоставлен уникальный символический идентификатор. Все системные идентификаторы определены при помощи директивы #define в заголовочном файле winuser.h. Это облегчает чтение и понимание программ.
Чаще всего приложение обрабатывает оконные сообщения (window messages), начинающиеся с префикса WM_, например: WM_PAINT, WM_SIZE, WM_M0VE и многие другие. Другие типы сообщений могут поступать от элементов управления, например: сообщения с префиксом ВМ_ поступают от кнопок, сообщения с префиксом ЕМ_ — от текстовых полей, сообщения с префиксом LB_ — от списков.
При необходимости разработчик может определить в приложении и потом использовать собственные коды сообщений. Обмен такими сообщениями возможен, конечно, только между окнами данного приложения. Иные приложения не смогут обрабатывать пользовательские сообщения.
Теперь о новом термине «оконный класс». На самом деле все окна создаются на базе того или иного оконного класса. Оконный класс играет роль типа для данного окна.