Не претендую на полную универсальность, но вроде как должно быть достаточно универсально.
Отображение независимого от устройства битмапа реализуется с помощью функции:
Код: Выделить всё
           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)
 
