- •Московский институт электронной техники
- •!!!! Замечание.
- •Введение.
- •Графические вставки из bmp-файлов в dos программах.
- •Графические вставки из bmp-файлов в win программах.
- •Графические вставки из bmp-файлов в dos программах в режиме работы с видеостраницами.
- •Графические вставки из bmp-файлов в win программах в режиме работы с оперативной памятью.
- •Перемещение по экрану графических вставок из bmp-файлов в dos программах.
- •Перемещение по экрану графических вставок из bmp-файлов в win программах. Использование двух контекстов памяти.
- •Использование набора bmp-файлов для создания эффекта движения. Чтение bmp-файлов из ресурсов программы.
- •Использование набора bmp-файлов для создания эффекта движения. Загрузка bmp-файлов в контекст памяти.
- •Задание к выполнению работы.
Использование набора 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.