Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / Lab_02 / labor_02pm.doc
Скачиваний:
10
Добавлен:
17.04.2018
Размер:
699.9 Кб
Скачать

Использование набора bmp-файлов для создания эффекта движения. Загрузка bmp-файлов в контекст памяти.

В программе mov10.exeимеется недостаток. Исполняемый файл оказывается очень большим. В нашем случае его размер равен 9.2MB. Это связано с тем, что 50bmp-файлов, являясь ресурсом программы, записываются в исполняемый файл.

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

После этого можно рисовать в памяти на созданной битовой карте.

Новую программу будем создавать на основе программы mov10.cpp. Новую программу поместим в файлmov11.cpp.

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

//копируем файл в память, получаем указатель на первый байт памяти

BYTE* ReadFileToMem(LPSTR lPstr)

{

//открываем файл для чтения

HFILE hFile = _lopen(lPstr, OF_READ);

//определяем размер файла

LONG FileSize = _llseek(hFile, 0L, FILE_END);

//указатель файла ставим в начало файла

_llseek(hFile, 0L, FILE_BEGIN);

//получаем указатель на первый байт выделенной памяти

BYTE* lpBuf = (BYTE*)GlobalLock(hBuf);

//копируем файл в память

_hread(hFile, lpBuf, FileSize);

//закрываем файл

_lclose(hFile);

return lpBuf;

}

//получаем указатель на первый байт изображения

BYTE* ImageBytes(BYTE* lpBuf)

{

//получаем указатель на первый байт структуры BITMAPFILEHEADER

LPBITMAPFILEHEADER lpfh = (LPBITMAPFILEHEADER)lpBuf;

//получаем указатель на первый байт изображения

BYTE* lpOff = (BYTE*)lpfh + lpfh->bfOffBits;

return lpOff;

}

//получаем указатель на первый байт структуры BITMAPINFOHEADER

LPBITMAPINFOHEADER BmpInfHead(BYTE* lpBuf)

{

//получаем указатель на первый байт структуры BITMAPINFOHEADER

LPBITMAPINFOHEADER lpih = (LPBITMAPINFOHEADER)(lpBuf + sizeof(BITMAPFILEHEADER));

return lpih;

}

Удобно все имена открываемых bmp-файлов поместить в отдельный массив строк. Для этого в функцииMove_OnCreate()добавляем несколько строк следующего кода.

//заполняем массив имен bmp-файлов nameShip[k]

//имена следущего вида: Ship10.bmp, Ship11.bmp, ... Ship59.bmp

//всего 50 имен

char is[3] = "";

char ssss[30] = "";

for( k=0; k<50; k++)

{

itoa(k+10,is,10);

strcpy(ssss,"BMP\\Ship");

strcat(ssss,is);

strcat(ssss,".bmp");

strcpy(nameShip[k],ssss);

}

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

//получаем указатель на первый байт блока памяти, куда скопирован файл nameShip[]

BYTE* lpBuf = ReadFileToMem(nameShip[numberBmp]);

//получаем указатель на первый байт изображения

BYTE* lpOff = ImageBytes(lpBuf);

//получаем указатель на первый байт структуры BITMAPINFOHEADER

LPBITMAPINFOHEADER lpih = BmpInfHead(lpBuf);

//устанавливает в битовой карте hBmp пиксели изображения по адресом lpOff

SetDIBits(hdcMem, hBmp, 0, lpih->biHeight, lpOff, (LPBITMAPINFO)lpih, DIB_RGB_COLORS);

Компилируем программу и получаем исполняемый файл mov11.exe, размером всего в 200KB. Запускаем программу на выполнение и результат работы этой программы показан на Рис.41.

Рис. 41.

Результат работы программы mov11.exe.

Соседние файлы в папке Lab_02