Вывод растровых изображений на экран В листинге 17.2 приведен код функции ShowBitmapО, которая отображает рисунок hBitmap в позиции (х, у) окна hWnd (см. файл OutBmp.cpp каталога BitmapTest).
Листинг 17.2
int ShowBitmap(HWND hWnd.HBITMAP Bit.int x.int у); {BITMAP ВПМар;
GetObject(Bit.sizeof(BITMAP),&BitMap);
//В структуру BitMap считываются параметры картинки.
int Height - BitMap.bmHeight; //Из ее полей bmWidth и bmHeight
int Width - BitMap.bmWidth; //берем размеры для копирования.
HDC hdc - GetDC(hWnd); //Получаем контекст изображения.
HDC hdcMem - CreateCompatibleDC(hdc); //Создаем контекст памяти
//В этот вспомогательный контекст заносится дескриптор битовой карты
HBITMAP OldBitmap - (HBITMAP)SeiectObject(hdcMem.Bit);
//Контекст hdcMem можно использовать для рисования средствами GDI
//Создаваемое изображение с учетом заданной растровой операции наносится на
//включенную в контекст картинку.
//В окно, с которым связан контекст изображения hdc. картинка
//переносится при помощи функции копирования
BitBltChdc.x.y. Width. Height.hdcMem.0.0.SRCCOPY);
//После копирования уничтожаем контексты памяти и изображения
Sei ectObj ect(hdcMem.OldBitmap);
DeleteDC(hdcMem);
ReleaseDC(hWnd.hdc):
}
Если в исходном тексте программы есть строка #include <windowsx.h>, то дескриптор hBit можно включить в контекст при помощи следующей конструкции:
HBITMAP OldBitmap - SeiectBitmap(hdcMem.hBit)
Выполнение команды меню Вывод ► Вывод картинки DIB проекта BitmapTest приведет к отображению картинки (рис. 17.1).
Вывод растровых изображений на экран
Рис. 17.1. Вывод растровой картинки После этого при помощи вызова пункта меню Время можно показать время рисования картинки в микросекундах. После загрузки битовой карты ИВНтар из файла и вызова функции отображения при помощи функции БИогл/ВитарО необходимость в хранении загруженного изображения отпадает, так как оно уничтожается функцией Ое^еО^есКИВитар).
Наличие различных форматов хранения растровых изображений ставит перед проектировщиком задачу оценки влияния выбора формата на время вывода изображения. Конечно, существует несколько предположений, которые кажутся вполне очевидными. Так, например, можно считать, что перенос изображения из одной области экрана в другую сводится к многократному копированию одной точки. Каждую точку картинки надо сначала прочитать из памяти, а потом записать по другому адресу, поэтому время копирования должно линейно зависеть от площади картинки. Также считается, что формирование изображения на экране основано на том, что за период кадровой развертки все ячейки видимой страницы видеопамяти поочередно считываются для управления интенсивностью электронного луча, пробегающего по строкам растра. Для записи изображения в видеопамять или считывания его процессором могут использоваться только свободные от процесса регенерации изображения циклы обмена с видеопамятью. Поэтому при одинаковых характеристиках микросхем обмен с системной памятью должен выполняться быстрее обмена с видеопамятью. Следует учитывать, что отображение из ООВ-формата не требует преобразования данных при копировании, поэтому оно должно выполняться быстрее.