Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 2.DOC
Скачиваний:
91
Добавлен:
10.05.2014
Размер:
827.9 Кб
Скачать

Компоновка составных изображений

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

SelectBitmap(hdcMem,hBitmap);//Выбираем в совместимый

//контекст дескриптор совместимой памяти

SetTextColor(hdcMem,RGB(0,0,200);//Изменяем цвет шрифта в

//совместимом контексте

SetTextMode(HdcMem,TRANSPARENT); //Делаем в нем фон прозрачным

charstr[]="Образец";//Строка для вывода поверх изображения

TextOut(hdcMem,100,100,str,strlen(str));//Выводим строку

Разумеется, выведенный в совместимую память текст не появится в окне приложение до тех пор, пока мы не скопируем совместимую память в окно функцией BitBlt().

Часто возникает необходимость размещения в окне нескольких изображений либо вывод небольшого рисунка поверх фонового изображения, которое само хранится в файле .BMPи должно быть сначала скопировано в окно. В таких случаях создается несколько областей совместимой памяти и, соответственно, несколько совместимых контекстов. В каждую область совместимой памяти загружается свое изображение, а затем эти области либо по отдельности копируются в окно приложения, либо (что лучше) сначала копируются в отдельную область совместимой памяти большого размера, а та уже копируется в окно (рис. 5.3).

Рис. 5.3. Объединение нескольких изображений в совместимой памяти и их копирование в окно приложения

Однако для выполнения такой процедуры необходимо иметь пустуюсовместимую память требуемого размера. Для такой памяти предусмотрена функцияCreateCompatibleBitmap():

HBITMAP hBitMap=CreateCompatibleBitmap(hdc,800,600);

В этом примере создается совместимая память размером во весь экран (800600 пикселов). Заметим, что для создания совместимой памяти таким способом так же, как и при создании совместимого контекста, требуется иметь контекст окнаhdc. Поскольку пустая совместимая память обычно создается заранее, в функцииOnCreate(), контекстhdcполучают вызовом функцииGetDC().

При создании пустой совместимой памяти с помощью функции CreateCompatibleBitmap()следует иметь в виду, что реально эта память отнюдь не пуста, а может быть заполнена любым “мусором”. Если затем эта память заполняется копируемым в нее изображением целиком, то “мусор”, разумеется, затирается. Если, однако, графические объекты выводятся в отдельные участки большого блока совместимой памяти, ее следует предварительно очистить. Проще всего это сделать с помощью функцииFillRect(), которая позволяет залить указанную в ее параметрах прямоугольную область любой кистью (не обязательно белой):

RECTrect;//Структура,описывающая прямоугольник

rect.left=rect.top=0;//Зальем всю совместимую память

rect.right=800;//размером 800600 пикселов

rect.bottom=600;

HBRUSH hBrush=CreateSolidBrush(RGB(180,250,250));//Кисть

FillRect(hdcMem,&rect,hBrush);//Заливаем

В этом примере вся совместимая память закрашивается бледно-бирюзовой кистью.