Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования для информатиков и инженеров. Часть 2 Прикладное программирование в Windows.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
603.45 Кб
Скачать

8.2. Виртуальное окно

 

Проблема перерисовки. Предыдущая программа демонстрирует работу основных текстовых и системных функций Windows. Однако при ее выполнении снова возникает проблема, которая уже рассматривалась в гл. 3. Вы запускаете эту программу, отображаете текст, затем Ваше окно перекрывается другим окном – и текст теряется. Если же окно перек­рывается не полностью, а частично, то пропадает часть текста. Решение проблемы состоит в том, что окно должно перерисовываться каждый раз при получении сообщения WM_PAINT, чего нет в нашем примере. Однако здесь возникает другой вопрос: какой механизм должно использовать это окно для перерисовки рабочей области? Как было сказано выше, имеется три основных метода. Напомним:

1) восстановить содержимое рабочей области, если оно формируется при помощи каких-либо вычислений;

2) можно запомнить последователь­ность событий и «проиграть» эту последовательность заново;

3) можно держать виртуальное окно и просто копировать его содержимое в рабочую область окна на экране каждый раз при получении сообщения VM_PAINT.

 

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

 

Виртуальное окно. В этом разделе описывается алгоритм использования виртуального окна. Прежде всего необходимо создать контекст устройства, совместимый с контекстом реального окна. После этого весь вывод нужно направлять на виртуальное устройство, и каждый раз при получении сообщения WM_PAINT содержимое виртуального устройства должно копироваться на реальное устройство вывода (в реальное окно). Таким образом можно всегда сохранить содержимое окна, так что если окно было перекрыто другим окном, а затем снова стало активным, его содержимое всегда можно восста­новить при получении сообщения WM_PAINT.

 

Дополнительные функции API. Поддержка виртуального окна осуществляется несколькими функциями API. Четыре из них – CreateCompatibleDC(),  SelectObject(),  GetStockObject() и BitBlt() – уже рассмотрены.

Кроме этих функций нам понадобятся функции

CreateCompatibleBitmap() и  PatBlt(),  которые описываются ниже.

Функция CreateCompatibleBitmap() создает в памяти растровое изображение, совмес­тимое с заданным контекстом устройства. Это растровое изображение (bitmap) может использоваться при помощи ссылок на совместимый контекст устройства который создается при помощи функции CreateCompatibleDC(). Прототип этой функции таков:

 

HBITMAP CreateCompatibleBitmap(HDC hdc, int width, int height);

 

Здесь hdc представляет контекст устройства, с которым должно быть совместимо создаваемое растровое изображение. Размеры растра задаются параметрами width и heightи указываются в пикселях. Функция возвращает дескриптор созданного растра в случае успешного завершения  и NULL – в случае возникновения ошибки.

Функция PatBlt() заполняет заданную прямоугольную область, используя цвет и способ заполнения, определяемый текущей кистью. Кисть (brush) – это объект, задающий способ заполнения окна (или области). Заполнение некоторой области при помощи кисти обычно называется рисованием области. Прототип функции PatBlt() выглядит так:

 

BOOL PatBlt(HDC hdc, int X, int Y, int width,

               int  height, DWORD dwRaster) ;

 

Здесь hdc представляет контекст устройства, на котором выполняется заполнение. Параметры Х и Y задают координаты верхнего левого угла прямоугольной области, которая будет заполняться. Размеры этой области задаются параметрами width и height. Параметр dwRaster определяет способ применения кисти и может принимать одно из следующих значений (табл. 8.3.):

Таблица 8.3