Не претендую на полную универсальность, но вроде как должно быть достаточно универсально.
Отображение независимого от устройства битмапа реализуется с помощью функции:
Код: Выделить всё
StretchDIBits(ULONG hdc, LONG XDest, LONG YDest, LONG nDestWidth, LONG nDestHeight, |
LONG XSrc, LONG YSrc, LONG nSrcWidth, LONG nSrcHeight, |
ULONG lpBits, ULONG lpBitsInfo, ULONG iUsage, ULONG dwRop),LONG,RAW,PASCAL,NAME('StretchDIBits')
большинство параметров понятно для чего, аналогично функции BitBlt. Осталось определить размер изображения и адреса для параметров lpBits и lpBitsInfo
lpBitsInfo - указатель на структуру BITMAPINFO, а lpBits - указатель на данные изображения, следующие за заголовком битмапа.
Нужно разбирать битмап. Исходные данные - адрес памяти. где расположен битмап и размер.
Сначала нужно считать заголовок файла (одинаковый для всех битмапов) в структуру BITMAPFILEHEADER.
Код: Выделить всё
BITMAPFILEHEADER GROUP,TYPE
bfType USHORT ! должно содержать две буквы BM (04D42H)
bfSize ULONG ! полный размер файла
bfReserved1 USHORT ! херь
bfReserved2 USHORT ! херь
bfOffBits ULONG ! кол-во байт, которое занимает заголовок файла и заголовок битмапа, потом пригодится
END
MyBmpFileHeader group(BITMAPFILEHEADER )
end
addrResource ULONG ! адрес ресурса в памяти, как получить, описывал в постах ранее
CODE
peek(addrResource, MyBmpFileHeader)
Код: Выделить всё
BITMAPINFOHEADER GROUP,TYPE
biSize ULONG
biWidth LONG ! ширина изображения
biHeight LONG ! высота изображения
biPlanes USHORT
biBitCount USHORT
biCompression ULONG
biSizeImage ULONG
biXPelsPerMeter LONG
biYPelsPerMeter LONG
biClrUsed ULONG
biClrImportant ULONG
END
MyBmpInfoHeader group(BITMAPINFOHEADER)
end
CODE
peek(addrResource+size(BITMAPFILEHEADER ), MyBmpInfoHeader)
Код: Выделить всё
lpImage ULONG
lpBitsInfo ULONG
CODE
lpImage = addrResource + MyBmpFileHeader.bfOffBits ! указатель на данные изображения
lpBitsInfo = addrResource+size(BITMAPFILEHEADER ) ! указатель на начало структуры BITMAPINFO
res# = PTB:StretchDIBits(hMemDC, rWin.Left, rWin.Top, rWin.Right-rWin.Left, rWin.Bottom-rWin.Top, |
0, 0, MyBmpInfoHeader.biWidth, MyBmpInfoHeader.biHeight, |
lpImage, lpBitsInfo, DIB_RGB_COLORS, SRCCOPY)