Очень интересно, но в VC нет такого простого класса, который может прочитать растровую картинку с диска, скажем BMP, и вывести её на экран. Ну нет и ладно, давайте создадим. Создавайте приложение AppWizard на основе SDI c именем TestDib.
Давайте теперь создадим новый класс через меню Insert -> New Class и имя ему дадим CDib. Вас спросят о его типе, давайте Generic Class. Вот каким он станет.
class CDib { public: CDib(); virtual ~CDib(); };
Давайте изменим его так, чтобы в конструктор передавали имя файла и при создании объекта класса сразу создавался файл.
class CDib { public: CDib(CString filename); virtual ~CDib(); void LoadFile(CString filename); };
Создаем код конструктора:
CDib::CDib(CString filename) { LoadFile(filename); }
А теперь LoadFile код:
void CDib::LoadFile(CString filename) { CFile file(filename,CFile::modeRead); BITMAPFILEHEADER bmf; file.Read((void *)&bmf,sizeof(bmf)); if (bmf.bfType != 0x4d42) { AfxMessageBox("Not Bmp File"); } else { DWORD sizebmp=file.GetLength()-sizeof(bmf); BYTE* ptrBmp = (BYTE*)GlobalAlloc(GMEM_MOVEABLE,sizebmp); file.Read((void*)ptrBmp,sizebmp); file.Close(); lpInfo=(LPBITMAPINFO)ptrBmp; } }
Мы добавили описание переменной в класс CDib:
class CDib { public: LPBITMAPINFO lpInfo; ........ };
И код деструтора для уничтожения выделенной памяти.
CDib::~CDib() { GlobalFree(lpInfo); }
Это пока только болванка, но в следующих шагам мы её расширим до необходимого рабочего примера. Как видите самое интересное это функция LoadFile. Для начала мы открываем файл используя класс CFile и передавая в конструктор имя файла для открытия. Открываем его для чтения. Дальше мы зачитываем заголовок файла в структуру BITMAPFILEHEADER. Первое, что мы проверим это то, что этот файл именно BMP. Если Вы откроете файл BMP в текстовом редакторе, то увидите, что он начитается с BM, что гарантирует вроде как, что это именно то.
Эта информация будет находится в поле bfType структуры. Вот это мы и проверяем. После этого мы можем расчитать память отняв от размера файла размер заголовка. Выделить память и прочитать туда файл. После чего файл закрываем. Для сохранения указателя на файл мы завели новую переменную и присвоили её значения выделенной памяти. Кроме этого добавили в деструктор освобождение памяти при закрытии объекта класса.