Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры печатать.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
379.36 Кб
Скачать

112 Разработка приложений Win32. Функция окна. Обработка сообщений wm_paint. Обработка сообщения wm_destroy. Функция DefWIndowProc().

Как уже говорилось, в каждом приложении должна быть функция WinMain() и функция окна (window function). Вспомним, что приложение Windows никогда не обращается к функциям окна непосредственно. Вместо этого программа посылает Windows запрос на выполнение данной операции. При этом используется функция обратного вызова. Windows регистрирует функцию обратного вызова, а затем при необходимости произвести над окном какую-либо операцию, вызывает ее. Сама функция окна может оказаться очень простой, обрабатывающей одно-два сообщения, а может быть и чрезвычайно сложной. Нетривиальные функции окна не только обрабатывают много типов сообщений, но и управляют различными окнами приложения.

Windows может посылать функции окна сообщения сотен различных типов. Тип сообщения задается константами, определенными в WINDOWS.H с префиксом WM_. Windows обращается к функции окна по различным поводам: при создании, перемещении, свертывании окна, изменении его размеров, при выборе пункта меню, при движении бегунка по полосе прокрутки, при необходимости перерисовать рабочую область, и наконец, при уничтожении окна.

Сообщение WM_PAINT

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

Первое сообщение, обрабатываемое данной функцией, — сообщение WM_PAINT, заставляющее приложение перерисовать рабочую область окна. Необходимо подготовить к перерисовке рабочую область окна и получить контекст устройства для окна (поскольку все функции работы с графикой требуют в качестве параметра контекст устройства). Полученный контекст устройства уже имеет текущие перо, кисть и шрифт.

За исключением самого первого сообщения WM_PAINT, посылаемого окну при вызове UpdateWindow() из WmMain(), эти сообщения будут посланы в следующих случаях:

  • при изменении размеров окна

  • если часть рабочей области была скрыта меню или окном диалога, которое в данный момент закрывается

  • при использовании функции ScrollWindow()

  • при принудительной генерации сообщения WM_PAINT вызовом функций InvalidateRect() или InvaUdateRgn()

Алгоритм приблизительно таков. Когда исчезает окно диалога, скрывавшее часть рабочей области окна, эта часть помечается как недействительная (invalid). Для эффективности перерисовки Windows отслеживает координаты прямоугольника, задающего недействительную область. Если этот прямоугольник не пуст, Windows посылает окну сообщение WM_PAINT. Если сразу несколько частей рабочей области оказались недействительными, Windows корректирует этот прямоугольник так, чтобы он охватывал их все. Другими словами, Windows старается не посылать WM_PAINT несколько раз подряд.

Вызов функции InvalidateRect() заставляет Windows пометить некоторую область как недействительную, вызывая таким образом сообщение WM_PAINT. Приложение может узнать координаты недействительной области, обратившись к функции GetUpdateRect(). Вызвав функцию ValidateRect(), можно отменить пометку заданной области как недействительной и удалить сообщения WM_PAINT, ожидающие обработки.

Обработка сообщения WM_PAINT завершается вызовом функции EndPaint(). Эта функция вызывается, когда приложение закончило вывод информации в рабочую область. Функция сообщает Windows, что приложение закончило обработку сообщения WM_PAINT и что теперь можно удалить контекст устройства.

Можно завершить приложение, выбрав Close из оконного меню. При этом окну будет послано сообщение WM_DESTROY. Обрабатывая WM_DESTROY, функция окна вызывает PostQuitMessage(), которая помещает в очередь сообщение WM_QUIT. После получения этого сообщения приложение заканчивает работу.

Все сообщения, не обрабатываемые данной функцией окна, передаются для обработки в функцию DefWindowProc(), стандартную функцию окна.