Но то, что мы сделали в прошлый раз еще не все. Нам теперь надо завести несколько переменных и вычислить их положение в растре.
class CDib { ..... LPBITMAPINFOHEADER lpHeader; RGBQUAD* lpRGB; BYTE* lpBMP; ....... };А теперь код для вычисления этих переменных.
void CDib::LoadFile(CString filename) { ........ // NEW !!! lpHeader=(LPBITMAPINFOHEADER)ptrBmp; lpRGB = (RGBQUAD*)(ptrBmp+lpHeader->biSize); int num=GetNumColor(); DWORD sizetable=num*sizeof(RGBQUAD); lpBMP=ptrBmp+lpHeader->biSize+sizetable; } }Мы объявили процедуру для вычисления количества цветов.
class CDib { ..... UINT GetNumColor(); };И её реализация.
UINT CDib::GetNumColor() { if ((lpHeader->biClrUsed == 0 ) && (lpHeader->biClrUsed <9)) return (1biClrUsed; }
Вот давайте посмотрим на наши деяния. Мы объявили новую переменную, как указатель на структуру информации о растре. Сразу за ней начинается таблица цветов. Указатель на неё мы и вычисляем. Теперь надо вычислить размер таблицы. Для этого нужно количество цветов. Если мы умножим количество цветов на размер одной записи и сложим с началом записей, то получим указатель уже на конкретные данные.