Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.doc
Скачиваний:
17
Добавлен:
14.02.2015
Размер:
641.54 Кб
Скачать

Сообщение wm_destroy

Еще одним важным сообщением является сообщение WM_DESTROY. Это сообщение показывает, что Windows находится в процессе ликвидации окна в ответ на полученную от пользователя команду. Пользователь вызывает поступление этого сообщения, если щелкнет на кнопке Close, или выберет Close из системного меню программы, или нажмет <Alt>+<F4>.

HELLOWIN стандартно реагирует на это сообщение, вызывая:

PostQuitMessage(0);

Эта функция ставит сообщение WM_QUIT в очередь сообщений программы. Как уже упоминалось, функция GetMessage возвращает ненулевое значение при любом сообщении, полученном из очереди сообщений за исключением WM_QUIT. КогдаGetMessage получает сообщение WM_QUIT, функция возвращает 0. Это заставляетWinMainпрервать цикл обработки сообщений и выйти в систему, закончив программу.

Сложности программирования для Windows

В короткой программе на С, написанной для обычной среды, вся программа целиком может поместиться в функции main. В HELLOWINWinMainсодержит только надстройку программы, необходимую для регистрации класса окна, создания окна и получения и передачи сообщений из/в очередь сообщений.

Все основные действия программы происходят в оконной процедуре. В HELLOWIN этих действий немного — это просто воспроизведение звука и вывод в окно строки текста. Но в следующих главах вы обнаружите, что почти в каждой программе для Windows работа с сообщениями происходит в оконной процедуре. Это основная концептуальная особенность, которую вы должны усвоить, чтобы начать писать программы для Windows.

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

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

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

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

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

Параметры wParamиlParamоконной процедуры не используются в HELLOWIN кроме как параметры дляDefWindowProc. Эти параметры дают оконной процедуре дополнительную информацию о сообщении. Значение этих параметров зависит от самого сообщения.

Давайте рассмотрим пример. Когда меняется размер рабочей области окна, Windows вызывает оконную процедуру. Параметр hwndоконной процедуры — это описатель окна, изменившего размер. ПараметрiMsgравен WM_SIZE. ПараметрwParamдля сообщения WM_SIZE равен одной из величин SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN, SIZEZOOMSHOW или SIZEZOOMHIDE (определяемых в заголовочных файлах Windows как числа от 0 до 4). ПараметрwParamпоказывает, будет ли окно свернуто, развернуто или скрыто (в результате развертывания другого окна). ПараметрlParamопределяет новый размер окна. Новая ширина (16-разрядное значение) и новая высота (16-разрядное значение) объединяются вместе в 32-разрядный параметрlParam. В заголовочных файлах Windows имеется макрос, который позволяет выделить оба эти значения изlParam.

Иногда, в результате обработки сообщения функцией DefWindowProc, генерируются другие сообщения. Например, предположим, что вы запускаете HELLOWIN и выбираете Close из системного меню программы, используя клавиатуру или мышь.DefWindowProcобрабатывает эту информацию. Когда она определяет, что вы выбрали опцию Close, то отправляет сообщение WM_SYSCOMMAND оконной процедуре.WndProcпередает это сообщениеDefWindowProc.DefWindowProcреагирует на него, отправляя сообщение WM_CLOSE оконной процедуре.WndProcснова передает это сообщениеDefWindowProc.DefWindowProcреагирует на сообщение WM_CLOSE, вызывая функциюDestroyWindow.DestroyWindowзаставляет Windows отправить сообщение WM_DESTROY оконной процедуре. И наконец,WndProcреагирует на это сообщение, вызывая функциюPostQuitMessage путем постановки сообщения WM_QUIT в очередь сообщений. Это сообщение прерывает цикл обработки сообщений вWinMainи программа заканчивается.