Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

3.1.2 Действительные и недействительные прямоугольники

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

Эту область называют "недействительном регионом" (invalid region) или "регионом обновления" (update region).

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

В Windows для каждого окна поддерживается "структура информации о рисовании" (paint information structure). В этой структуре содержатся (помимо другой информации) координаты минимально возможного прямоугольника, содержащего недействительную область. Эта информация носит название "недействительного прямоугольника" (invalid rectangle); иногда — "недействительного региона" (invalid region). Если еще один регион рабочей области становится недействительным перед обработкой сообщения WM_PAINT, Windows рассчитывает новый недействительный регион, который содержит оба эти региона и запоминает эту новую информацию в структуре информации о рисовании. Windows не помещает в очередь сообщений сразу несколько сообщений WM_PAINT.

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

После того как оконная процедура вызывает функцию BeginPaint при обработке сообщения WM_PAINT, вся рабочая область становится действительной. Программа, вызвав функцию ValidateRect, также может сделать действительной любую прямоугольную зону в рабочей области. Если этот вызов делает действительной всю рабочую область, тогда любое сообщение WM_PAINT, имеющееся в это время в очереди сообщений, удаляется из нее и не обрабатывается.

3.2 Введение в графический интерфейс устройства (gdi)

Для рисования в рабочей области вашего окна, вы используете функции графического интерфейса устройства. В Windows имеется несколько функций GDI для вывода строк текста в рабочей области окна. В главе 2 вы уже встречались с функцией DrawText, но гораздо более популярной функцией является TextOut. Формат этой функции следующий:

TextOut(hdc, x, y, psString, iLength);

Функция TextOut выводит на экран строку символов. Параметр psString — это указатель на строку символов, а iLength — длина строки символов. Параметры x и y определяют начальную позицию строки символов в рамках рабочей области. Параметр hdc — это "описатель контекста устройства" (handle to a device context), являющийся важной частью GDI. Практически каждой функции GDI в качестве первого параметра необходим этот описатель.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]