Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Работа с растровыми изображениями






 

Поскольку Windows – это операционная система, работающая в графическом режиме, Вы можете использовать в своих программах графические элементы. Поэтому важно уяснить, как в рабочей области окна можно рисовать такие элемен­ты, как линии, круги и прямоугольники, используя разнообразные функции Win­dows API (эти функции будут рассматриваться позже). Как само растровое изображение, так и способ вывода его на экран отличаются от упомянутых графи­ческих элементов. Растровое изображение является самоопределенным ресурсом, который программа использует как единое целое. Оно содержит побитовое пред­ставление рисунка, которое отображается на экране таким, как оно есть, иначе говоря, программа отображает его как единое целое.

 

Создание растрового изображения. Прежде чем написать программу, рисующую растровое изображение, сначала нужно создать собственно растровое изображение. Для этого, как и в случае с другими графическими ресурсами, следует воспользоваться помощью графического редакто­ра. В отличие от курсоров и иконок, размеры которых предопределены, для растро­вого изображения можно задать любой размер. Для работы с примером, приведенным ниже, понадобится растровое изображение размером 77 на 77 пиксел. Назовите этот файл Bfly1.bmp и добавьте в файл ресурсов строку:

 

MYBP1 BITMAP Bfly1.bmp

 

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

Прежде чем использовать в программе растровое изображение, необходимо загрузить его и запомнить его дескриптор. Лучше всего это можно сделать в функции WinMain(). Для загрузки растрового изображения используется функция API LoadBitmap():

 

HBITMAP LoadBitmap(HINSTANCE hThisInst,

LPCSTR IpszName);

 

Параметр hThisInst должен содержать дескриптор текущего экземпляра приложе­ния, a lpszName – указатель на строку-имя растрового изображения, заданную в файле ресурсов. Эта функция возвращает дескриптор загруженного растрового изоб­ражения либо NULL при возникновении ошибки. Например:

 

HBITMAP hBit1; // Дескриптор растра

...

hBit1=LoadBitmap(hThisInst, " MYBP1"); //Загрузить растр


Этот фрагмент программы загружает растровое изображение с именем MYPP1, и запоминает полученный дескриптор в hBit1.

Перед выводом растрового изображения на экран, Ваша программа должна будет выполнить следующую последовательность действий:

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

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

3. Выбрать растровое изображение в контексте устройства памяти.

4. Скопировать растровое изображение из памяти в окно вывода, из контекста устройства памяти в контекст устройства окна. Это приведет к появлению растрового изображения на экране.

 

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

 

case WM_LBUTTONDOWN:

DC=GetDC(hwnd); // Получить DC

memDC=CreateCompatibleDC(DC); // Совместимый DC

SelectObject(memDC, hBitl);

BitBlt(DC, LOWORD(lParam), HIWORD(lParam), 77, 77,

memDC, 0, 0, SRCCOPY); // Вывод растра на экран

ReleaseDC(hwnd, DC); // Освободить DC

DeleteDC(memDC); // Освободить DC памяти

break;

 

Рассмотрим подробнее этот фрагмент программы. Сначала объявляются два контек­ста устройств. DC будет сохранять текущий контекст устройства окна, получаемый при вызове GetDC(). Другой контекст устройства memDC создается для памяти, в которой будет храниться растровое изображение. Внутри оператора case сначала необходимо получить контекст устройства для окна. Этот оператор необходим, поскольку растровое изображение будет выводиться в рабочей области окна, а вывод возможен только после получения контекста устройства. Затем создается контекст устройства для памяти, в которой хранится растровое изображение. Этот контекст устройства должен быть совместим с контекстом устройства окна.

Совместимый контекст устройства создается при вызове функции API CreateCompatibleDC() вида:

 

HDC CreateCompatibleDC(HDC hdc);

 

Данная функция возвращает дескриптор области памяти, совместимой с контек­стом устройства окна, который задается, в параметре hdc. Эта память будет исполь­зоваться для создания изображения перед выводом его на экран. При возникновении ошибки функция возвращает NULL.

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

 

HGDIOBJ SelectObject(HDC hMdc, HGDIOBJ hObject);

 

Здесь hMdc задает контекст устройства для памяти, в которой хранится объект, a hObject – дескриптор этого объекта. Функция возвращает дескриптор объекта, который был выбран ранее, позволяя при необходимости выбирать его опять.

Чтобы вывести выбранный объект на экран, используется функция API BitBlt(), которая копирует растровое изображение из одного контекста устройства в другой. Вот ее прототип:

 

BOOL BitBlt(HDC hDest, int X, int Y,

int Width, int Height, HDC hSource,

int SourceX, int SourceY, DWORD dwRaster);

 

Здесь hDest обозначает контекст устройства вывода, a X и Y – координаты точки верхнего левого угла прямоугольника, в который будет выводиться растровое изоб­ражение. Размеры выводимого растрового изображения задаются параметрами Width и Height. Параметр hSourse содержит дескриптор исходного контекста устройства, который в этом случае является контекстом памяти, полученным при вызове СгеаteCompatibleDC(). Параметры SourceX и SourceY задают координаты верхнеголевого угла растрового изображения. Обычно они равны 0. Параметр dwRaster задает способ вывода растрового изображения на экран. Наиболее часто используемые значения этого параметра приведены в следующей таблице 6.1.

 

Таблица 6.1






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.