![]() |
|
#1
|
||||
|
||||
![]() Здравия всем!
Столкнулся с некоторой проблемкой при работе с HBitmap; Использую WinAPI. Суть - Не могу сделать SelectObject на 4 битный битмап. Использую именно 4 битный, т.к. графические данные подготовлены в 16 цветной индексированной палитре, поэтому переводить в 32 бит - затратно для производительности приложения. Вот пример использования: Код:
Const data2: array[0..63] of byte = ( $00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00, $00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00, $00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00, $00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00 ); ... procedure TForm1.Button1Click(Sender: TObject); var HDC:THandle; BufferImages:HBitmap; BDC:THandle; Select:LongWord; begin Image1.Picture.Bitmap.Width:=8; Image1.Picture.Bitmap.Height:=8; HDC:=Image1.Picture.Bitmap.Canvas.Handle; BufferImages:=CreateBitmap(8,8,1,4,@data2); //??? BDC:=CreateCompatibleDC(HDC); Select:= SelectObject(BDC,BufferImages); if Select =0 then ShowMessage('Selected error'); BitBlt(HDC,0,0,8,8,BDC,0,0,SRCCOPY); ReleaseDC(BDC,BufferImages); DeleteDC(BDC); DeleteObject(BufferImages); end; CreateBitmap(8,8,1,1,@data2) - то нормально, а если: CreateBitmap(8,8,1,4,@data2) - то SelectObject = 0 и соответственно на контексте ничего. Аналогичная ошибка при 8, 16 битах, а 32 понятно норм. При этом сам CreateBitmap возвращает идентификатор в любом случае. а установка Код:
Image1.Picture.Bitmap.PixelFormat:=pf4bit; Пробовал использовать CreateDIBSelection, SetDIBits, StretchDiBits - не помогает. SetDIBits и StretchDiBits что-то пытаются, но слишком геморно. Собственно вопрос как отрисовать 4 битный битмап (на 32 битном контексте)? Програмистами не рождаются, ими становятся! |