Оконная
процедура
Теперь рассмотрим,
как устроена оконная процедура wndProc. Ее имя уже дважды появлялось в тексте
программы. Сначала был объявлен ее прототип, затем оно было присвоено одному
из полей структуры типа WNDCLASSEX. Поле имеет тип указателя на функцию с особым
прототипом оконной функции. Здесь полезно вспомнить, что имя функции трактуется
компилятором C++ как ее адрес.
Оконная процедура
должна «просеивать» все посылаемые ей сообщения и обрабатывать те из них, которые
были выбраны программистом для обеспечения желаемой функциональности. Типичной
структурой оконной процедуры является switch-блок, каждая ветвь которого содержит
обработку одного сообщения. В первом приближении наша оконная процедура реагирует
только на три сообщения:
- WM_COMMAND — о выборе
пользователем одной из команд меню;
- WM_PAINT — о необходимости
перерисовать клиентскую область окна;
- WM_DESTROY — о необходимости
закрыть окно.
Сообщение WM_DESTROY
(уничтожить окно) посылается системой уже после того, как окно исчезло с экрана.
Мы реагируем на него вызовом функции PostQuitMessage, которая указывает системе,
что поток приложения требует своего завершения, путем посылки сообщения WM_QUIT.
Его параметром является код завершения, который мы указываем при вызове PostQuitMessage.
Примечание
Рассмотренная структура
приложения Win32 позволяет сделать вывод, что в подавляющем числе случаев
развитие приложения сосредоточено внутри оконной процедуры, а не в функции
WinMain. Развитие приложения заключается в том, что в число обрабатываемых
сообщений (messages) включаются новые. Для этого программист должен вставлять
новые case-ветви в оператор switch (msg).
Если оконная
процедура не обрабатывает какое-либо сообщение, то управление передается в ветвь
default. Вы видите, что в этой ветви мы вызываем функцию DefWindowProc, которая
носит название оконной процедуры по умолчанию. Эта функция гарантирует, что
все сообщения будут обработаны, то есть, удалены из очереди. Возвращаемое значение
зависит от посланного сообщения.
Вы, конечно,
обратили внимание на обилие новых типов данных, которые используются в приложениях
Win32. Многие из них имеют префикс Н, который является сокращением слова Handle
— дескриптор, описатель. Описатели разных типов (HWND, HPEN, HBITMAP и т. д.)
являются посредниками, которые помогают найти нужную структуру данных в виртуальном
мире Windows. Объекты Windows или ее ресурсы, такие как окна, файлы, потоки,
перья, кисти, области, представлены в системе структурами языка С, и адреса
этих структур могут изменяться. В случае нехватки реальной памяти Windows выгружает
из памяти ненужные в данный момент времени объекты и загружает на их место объекты,
требуемые приложением. В системной области оперативной памяти Windows поддерживает
таблицу, в которой хранятся физические адреса объектов. Для поиска объекта и
управления им сначала следует получить у системы его описатель (место в таблице,
индекс). Важно иметь в виду, что физический адрес объекта — понятие для Windows,
а не для программиста. Описатель типа HANDLE можно уподобить номеру мобильного
телефона, с помощью которого вы отыскиваете объект, перемещающийся в виртуальном
мире Windows.