Что я пытаюсь сделать:
Хочу загрузить BMP-картинку в память и нарисовать ее на поверхности DirectDrawSurface.
Битмапку гружу вручную (чтение заголовка, цветовых данных...)
Затем при помощи DrawDibDraw рисую изображение на поверхности.
В чем проблема:
По непонятным мне причинам, DrawDibDraw иногда вылетает со значением FALSE. При этом естественно ничего не рисуется!
Однако такое происходит не всегда!!! Иногда (как повезет) все проходит гладко...
Еще интересно: в пошаговом режиме трассировки программы ошибок не возникает.
В чем же ошибка?
Кто-нибудь уже сталкивался с подобнойситуацией?!...
Здравствуйте, UJey, Вы писали:
UJ> Битмапку гружу вручную (чтение заголовка, цветовых данных...)
Зачем? Не легчели взять DC у Surface и грузить в него?
A>Объявления переменных опущены
A>lpSurface->GetDC(&hDC)
A>hDCCompatible = CreateCompatbleDC(hDC)
A>hBitmap = LoadImage(hInstance,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
A>SelectObject(hDCCompatible,hBitmap);
A>BOOL BitBlt(hDC,0,0,width,height,hDCCompatible,0,0,SRC_COPY);
A>Ну и подчистить за собой
A>
A>width и height получть с помощью
A>
A>BOOL GetBitmapDimensionEx(
A> HBITMAP hBitmap, // handle to bitmap
A> LPSIZE lpDimension // dimensions
A>);
A>
СУПЕР! Как я сам не догадался!
А можно еще что-то аналогичное придумать для AVI файла, потому как у меня задача — выводить на экран картинки и видео.
Может есть что-то похожее? Потому что, почти все функции для AVI выдают кадр в виде DIB изображений...
Ходят слухи, что DirectShow умеет рисовать в Surface
Но если лень разбирать с directshow (а заодно терять в произодительности) то вроде можно HBITMAP из DIBSection делать
HBITMAP CreateDIBitmap(
HDC hdc, // handle to DC
CONST BITMAPINFOHEADER *lpbmih, // bitmap data
DWORD fdwInit, // initialization option
CONST VOID *lpbInit, // initialization data
CONST BITMAPINFO *lpbmi, // color-format data
UINT fuUsage // color-data usage
);