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

7.3. Отображение содержимого окна wm_paint

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

Здесь нужно пояснить, что окно разделяется на неклиентскую и рабочую (клиентскую) области. К неклиентской части относится заголовок окна и его обрамление. Перерисовка этой области – забота Windows, поскольку операционная система “знает” о стилях каждого окна, а они то и определяют, что нужно нарисовать в неклиентской части. Вся внутренняя часть окна относится к клиентской области, вот ее то перерисовку вы и должны запрограммировать в обработчике WM_PAINT, поскольку Windows не может знать, чего хочет каждый программист.

7.3.1. Случаи генерации сообщения wm_paint

Перечислим основные ситуации, когда клиентская область становится недействительной.

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

  • Увеличение (но не уменьшение!) размеров окна, в стиле класса которого заданы флаги CS_HREDRAW и CS_VREDRAW, приводит к тому, что вся рабочая область также становится недействительной. Операционная система вслед за этим посылает в очередь сообщение WM_PAINT.

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

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

  • Если при обработке любого сообщения требуется изменить содержимое окна, то приложение может объявить любую область собственного окна недействительной при помощи функции InvalidateRect(), а затем сообщить Windows, что необходимо перерисовать эту часть, вызвав функцию UpdateWindow().

Функция InvalidateRect() объявлена следующим образом:

void InvalidateRect(HWND hwnd, const RECT* lprc, BOOL fErase)

Первый параметр – дескриптор окна, для которого выполняется операция. Второй – указатель на структуру типа RECT, определяющую прямоугольную область, подлежащую обновлению. Если указатель равен NULL, вся клиентская область объявляется недействительной. Третий параметр указывает на необходимость стирания фона окна, если он задан как TRUE, фон окна подлежит стиранию.