- •Московский институт электронной техники
- •!!!! Замечание.
- •Введение.
- •Графические вставки из bmp-файлов в dos программах.
- •Графические вставки из bmp-файлов в win программах.
- •Графические вставки из bmp-файлов в dos программах в режиме работы с видеостраницами.
- •Графические вставки из bmp-файлов в win программах в режиме работы с оперативной памятью.
- •Перемещение по экрану графических вставок из bmp-файлов в dos программах.
- •Перемещение по экрану графических вставок из bmp-файлов в win программах. Использование двух контекстов памяти.
- •Использование набора bmp-файлов для создания эффекта движения. Чтение bmp-файлов из ресурсов программы.
- •Использование набора bmp-файлов для создания эффекта движения. Загрузка bmp-файлов в контекст памяти.
- •Задание к выполнению работы.
Графические вставки из bmp-файлов в win программах.
Вставить графический bmp-файл, любогоbmp-формата вWindows-программу значительно легче, чем в соответствующуюDOS-программу. Существует несколько способов подключенияbmp-файла к программе.
Наиболее быстрый способ, это рассматривать bmp-файл как компонент ресурсов приложения. Рассмотрим этот способ.
Пусть изображение корабля будет располагаться в поле вывода, размером 640480 пикселей. Подготовим соответствующийbmp-файл. Причем возьмем самое большое количество цветов 255255255 = 16 777 216 (около 17 миллионов цветов). Для этого подойдетbmp-файл с форматом в 24 бита. Возьмем картину корабля в файлеship_24.bmpформата 102476824bbmp. Используем программуCorelPHOTO-PAINT, как было показано выше. В результате получаем нужный нам файлship_24b.bmpв формате 64048024bbmp.
Пусть новая программа будет создана на основе программы move01.cpp. В этой программе уберем фон в виде зеленого эллипса и систему координат, и вместо фона будем использовать картину корабля изbmp-файлаship_24b.bmp. Создадим проект с именемmove07.
Далее создадим файл ресурсов move07.rc. Этот файл будет содержать всего лишь одну строчку.
BitmapShip BITMAP "ship_24b.bmp"
Теперь сделаем необходимые изменения в файлеmove07.cpp. В начале файла вставим одну строчку кода.
//идентификатор приложения
HINSTANCE hInstApp;
В функции CreateApp() добавим строчку.
hInstApp = hInstance;
Это сделано для того, чтобы идентификатор приложения стал глобальной переменной в программе.
В функции Move_OnCreate() изменим размеры поля вывода, сделав его размером 640480.
nLeft = 60; nRight = 700; mTop = 15; mBottom = 495;
Растровое изображение, находящееся в bitmap-ресурсе обрабатывается следующим образом.
При создании исполняемого exe-файла, все ресурсы, в том числе иbitmap-ресурсы, располагаются вexe-файле. Чтобы использоватьbitmap-ресурс, ему надо придать в памяти вид битовой карты. Эту операцию выполняет функцияLoadBitmap(). Эта функция беретbitmap-ресурс из загруженного в памятьexe-файла, придаетbitmap-ресурсу вид битовой карты и загружает в новую область памяти.
Далее для рисования в памяти создается контекст памяти, совместимый с контекстом экрана, с помощью функции CreateCompatibleDC().
Затем битовая карта связывается с контекстом памяти с помощью функции SelectObject().
После этого изображение из контекста памяти копируется в контекст экрана с помощью функции BitBlt(). В результате растровое изображение появляется на экране в окне приложения.
В конце полагается убрать битовую карту из памяти, восстановить контекст памяти и убрать контекст памяти.
В функции Move_OnPaint()выполняются все перечисленные действия. Добавим в функцию Move_OnPaint() несколько строчек кода, для вывода растрового изображения из памяти в окно программы.
//создаем контекст памяти hdcMem, совместимый с контекстом экрана hdc
HDC hdcMem = CreateCompatibleDC(hdc);
//загружаем в память bitmap-ресурс из модуля exe-файла
//hInstApp - идентификатор экземпляра приложения
//"BitmapShip" - идентификатор bitmap-ресурса (в файле ресурсов)
//hBitmap - идентификатор загруженного bitmap-ресурса
HBITMAP hBitmap = LoadBitmap(hInstApp, "BitmapShip");
//выбираем bitmap-объект hBitmap в контекст памяти hdcMem
HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMem, hBitmap);
//копируем изображение из контекста памяти в контекст экрана
BitBlt(hdc, nLeft, mTop, nRight-nLeft, mBottom-mTop, hdcMem, 0, 0, SRCCOPY);
DeleteObject(hBitmap); //убираем растровое изображение из памяти
SelectObject(hdcMem, hBitmapOld); //восстанавливаем контекст памяти
DeleteDC(hdcMem); //убираем контекст памяти
Убираем строчку вызова функции, которая рисовала старый фон.
// Land(hdc);
Компилируем, запускаем программу mov07.exe, и результат работы этой программы будет таким же, как и на Рис.34. Правда, насыщенность красок буде несравненно выше.
Рис. 35.
Результат работы программы mov07.cpp.