Главная » Win32 API » Технология отображения растров

0

Для вывода DIB-растров используются функции StretchDIBits и SetDIBitsToDevice. Функция StretchDIBits имеет следующие пара­метры:

-  дескриптор контекста устройства;

-  х и у координаты, ширина и высота области-приемника изобра­жения (в логических единицах);

-  х и у координаты, ширина и высота области-источника изображе­ния^ пикселах);

-  адрес массива пикселов изображения;

-  адрес заголовка информационного блока в bmp;

-  флаг интерпретации цветовой таблицы;

-  код растровой операции.

Область-источник указывает, какая часть растра выводится, проис­ходит ли зеркальное отображение по горизонтали и/или по вертикали. Область-приемник задает место на поверхности изображения графиче­ского устройства, область-приемник также можно зеркально отразить и масштабировать. Если размеры областей источника и приемника совпадают, то вывод растра происходит без масштабирования. Способ добавления новых или удаления ненужных пикселов хранится в кон­тексте устройства и может быть изменен функцией SetStretchBltMode. Так, возможно вычислять средний цвет по группе пикселов, комбинировать пикселы с помощью побитовых логических операций, отбрасывать лишние пикселы.

Флаг интерпретации цветовой таблицы указывает, что именно со­держит эта таблица компоненты RGB или индексы цветов в логиче­ской палитре.

Код растровой операции показывает способ копирования из облас­ти-источника в область-приемник. Простейшим кодом является SRCCOPY, задающий копирование без дополнительных операций.

Функция SetDIBitsToDevice позволяет выводить растры с сохране­нием масштаба и ориентации либо полностью, либо по строкам.

Для работы с DDB-растрами, являющимися объектами GDI и хра­нящимися в памяти GDI, используются другие API-функции.

Создать DDB-растр можно с помощью функций CreateBitmap, CreateBitmapInDirect, CreateCompatibleBitmap. Все эти функции возвращают дескриптор растрового объекта. CreateBitmap имеет сле­дующие параметры;

-  ширина и высота растра в пикселах;

-  количество плоскостей cPlanes для хранения цвета пиксела;

-  количество битов на 1 пиксел cBitsToPxl;

-  адрес массива с пикселами.

По параметрам cPlanes и cBitsToPxl драйвер графического устрой­ства осуществляет подбор формата хранения цвета, чтобы количество битов на пиксел не превышало произведения указанных параметров.

Функция CreateBitmapInDirect работает с теми же параметрами, что и CreateBitmap, однако они передаются через структуру типа BITMAP. Функция CreateCompatibleBitmap создает DDB-растр, со­вместимый с контекстом заданного устройства. Недостатком трех рас­смотренных функций является то, что они создают либо монохромный растр с инициализацией пикселов, либо цветной растр без инициали­зации.

Для работы в программе с инициализированными цветными рас­трами лучшим выходом является использование ресурсов. Ресурсами являются пиктограммы, рисунки, меню, диалоговые окна, курсоры и шрифты. Они описываются во внешнем текстовом файле, называемом файлом ресурсов и имеющим расширение гс. Различные ресурсы опи­сываются в нем в соответствии со своими форматами. Для того чтобы включить ресурсы в *.ехе файл, их необходимо откомпилировать спе­циальным компилятором ресурсов, который может быть встроен в ин­тегрированную среду разработки программ. Результатом работы ком­пилятора ресурсов является файл с расширением res, который вместе с объектным модулем обрабатывается редактором связей для получения ехе-файла. Преимуществами использования ресурсов являются про­стота их редактирования и независимость описания от текста исходно­го модуля, возможность редактирования ресурсов непосредственно в загрузочном файле (например, для перевода пунктов меню на другой язык), возможность извлечения ресурсов из загрузочного файла для последующего использования в других приложениях.

Каждому ресурсу при описании присваивается идентификатор ре­сурса, который затем используется API-функциями. Например, описа­ние пиктограммы ICON1.ICO имеет вид:

Идентификатор_ресурса ICON [параметры] "ICON1.ICO"

а описание растрового изображения BITMAP1.BMP:

Идентификатор_ресурса BITMAP   [параметры]   "BITMAP1.BMP" В MASM32 используется числовой идентификатор ресурса.

Несмотря на важность DDB-растров, в Windows отсутствует функ­ция их отображения на устройстве вывода. Их вывод осуществляется

путем копирования с одного устройства на другое как без изменения масштаба (функция BitBlt), так и с изменением (функция StretchBlt). Устройством-приемником служит окно, а в качестве устройства-источника в памяти нужно создать область, которая по своим возмож­ностям должна быть совместима с экраном и в которую нужно запи­сать изображение. Совместимая с окном область памяти также должна иметь свой контекст, называемый контекстом памяти или совмести­мым контекстом памяти. В контексте памяти хранятся дескрипторы инструментов рисования, которые можно заменять на свои, в контекст памяти можно выводить графику. Отличием контекста памяти от кон­текста окна является возможность загрузки в контекст памяти деск­риптора растрового изображения.

Рассмотрим реализацию вывода на экран DDB-растра, описанного как ресурс. Для вывода растрового изображения необходимо выпол­нить следующие действия:

1)      загрузить растровое изображение в память и запомнить его деск­риптор. Для этого используется функция LoadBitmap, первым пара­метром которой является дескриптор экземпляра приложения, а вто­рым идентификатор ресурса, описывающего DIB-растр. Функция выделяет память под изображение, загружает его туда, преобразует в DDB-формат и возвращает дескриптор hBmp области памяти с рас­тром. Этот шаг выполняется вне обработки сообщения WMPAINT. Отметим, что если требуется работать с изображением, размер которо­го будет известен позже, то можно зарезервировать требуемый объем памяти функцией CreateCompatibleBitmap. Загрузку битового образа можно осуществлять с помощью функции Loadlmage, загружающей не только растры, но еще пиктограммы и курсоры. Loadlmage воз­вращает дескриптор DDB-растра.

2)  получить совместимый с окном контекст устройства для области памяти, где будет храниться изображение, с использованием функции CreateCompatibleDC, единственным параметром которой является дескриптор контекста устройства, куда должно быть выведено изо­бражение. Этот дескриптор hDC либо возвращается функцией Begin-Paint в обработке WMPAINT, либо должен быть получен с помощью функции GetDC. Если использовалась функция GetDC, необходимо после работы вернуть контекст системе с помощью функции Re-leaseDC.

3)      включить дескриптор области памяти с растровым изображени­ем hBmp в совместимый с окном контекст памяти, используя функцию SelectObject. Значение дескриптора растрового изображения по умол­чанию в совместимом контексте нужно сохранить, хотя он описывает

изображение размером всего в 1 пиксел. После этого в совместимую память можно выводить любые объекты, вызывать функции рисова­ния.

4) Для того чтобы отобразить на экране созданное изображение,
необходимо скопировать его в окно с использованием функций BitBIt
или StretchBlt. Рассмотрим вызов и параметры функции BitBIt. Вызов
имеет вид:

BitBIt(hDC,x,у,w,h,memDC,xO,y0,FLAG)

Параметры:

-  hDC и memDCдескрипторы окна приложения, куда копируется изображение, и совместимого контекста памяти;

-  хО и уО координаты начальной точки верхнего левого угла изо­бражения-источника, с которой начинается копирование в изображе­ние-приемник. Если все изображение копируется полностью, то нужно указать нулевые значения хО и уО;

-  х и у задают координаты верхнего левого угла копии в окне, счи­тая от начала его клиентской области;

-  w и h задают ширину и высоту копируемой прямоугольной части изображения. Максимальное значение этих параметров ширина и высота в пикселах исходного изображения. Характеристики изображе­ния можно получить с помощью функции GetObject, которая для рас­трового изображения заполняет структуру BITMAP, поля которой bmWidth и bmHeight хранят ширину и высоту изображения.

-  FLAG указывает вид операции над битами изображения и бита­ми области копирования, что используется для реализации мультипли­кации. В простейшем случае FLAG=SRCCOPY, что указывает на ко­пирование источника в приемник с затиранием области копирования. Если нужно реализовать мультипликацию, то в цикле перемещения объекта сначала выводится изображение с FLAG=SRCCOPY, затем после задержки с FLAG=MERGEPAINT, что дает стирание изображе­ния и получение белого фона, после чего изменяют координаты выво­да.

Функция StretchBlt позволяет масштабировать изображение и вы­полнять его зеркальные отражения.

5)      вернуть в совместимый контекст памяти старое значение деск­риптора битового изображения.

6)  Уничтожить контекст совместимой с окном области памяти.

Иллюстрирующий текст продедуры вывода DDB-растра на MASM32:

Paint_Proc proc hWin:DWORD, hDC:DWORD

LOCAL hold:DWORD

LOCAL memDC :DWORD

invoke CreateCompatibleDC,hDC

mov memDC, eax

invoke SelectObject,memDC,hBmp

mov hold, eax

invoke BitBlt,hDC,10,10,166,68,memDC,0,0,SRCCOPY

invoke SelectObject,memDC,hold

invoke DeleteDC,memDC

return 0 Paint_Proc endp

Источник: Сучкова, Л.И. Win32 API: основы программирования: учебное пособие/ Л.И. Сучкова; АлтГТУ им. ИИ. Ползунова. -Барнаул, АлтГТУ, 2010. 138 с, ил.

По теме:

  • Комментарии