У меня есть элемент управления MFC, которому я передаю дескриптор растрового изображения (HBITMAP).В элементе управления OnPaint я использую BitBlt для рендеринга растрового изображения.Но растровое изображение отображается вверх ногами.
В качестве теста я создал объект CBitmap из этого дескриптора и записал его в файл, и он создал растровое изображение, которое было справа вверх.Так что я делаю что-то не так с моим звонком в BitBlt?
Я разместил свой код на OnPaint ниже.Я попытался изменить режим отображения контекста моего устройства на MM_LOENGLISH и смог получить растровое изображение для рендеринга правой стороной вверх, но оно было очень зернистым.Когда я покидаю режим отображения в MM_TEXT, качество изображения идеальное, но, как я уже сказал, оно перевернуто.Я мало работал с растровыми изображениями, блиттингом и т. Д., Поэтому я мог упустить что-то простое.Любые другие предложения будут оценены.Для некоторого фона я беру BYTE * из драйвера видеокамеры и создаю HBITMAP для рендеринга видео.Как я могу заставить это сделать правильно?Большое спасибо
void BitmapControl::OnPaint()
{
EnterCriticalSection (&CriticalSection);
if (_handleBMP)
{
CPaintDC dc(this);
//dc.SetMapMode(MM_LOENGLISH);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CRect rect;
GetClientRect(&rect);
dc.DPtoLP(&rect);
CBitmap* pBmpOld = dcMem.SelectObject(CBitmap::FromHandle(_handleBMP));
BitBlt(dc,rect.left,rect.top,rect.Width(),rect.Height(),dcMem,rect.left,rect.top,SRCCOPY); //works with MM_TEXT but upsidedown
//BitBlt(dc,0,rect.bottom,rect.Width(),-rect.Height(),dcMem,0,0,SRCCOPY); //works with MM_LOENGLISH
dcMem.SelectObject(pBmpOld);
DeleteDC(dc);
DeleteDC(dcMem);
DeleteObject(_handleBMP);
DeleteObject(pBmpOld);
_handleBMP = NULL;
}
LeaveCriticalSection (&CriticalSection);
}
edit * Я предполагал, потому что я мог сохранить растровое изображение на диск в правильной ориентации, что проблема была с bitblt.Вот код, который я использую для генерации HBITMAP.
HBITMAP BitmapWriter::CreateBitmapFromFrame(BYTE* frame)
{
BITMAPFILEHEADER* bmfh;
bmfh = (BITMAPFILEHEADER*)frame;
BITMAPINFOHEADER* bmih = &_bmi;
BITMAPINFO* bmpInfo = (BITMAPINFO*)bmih;
HBITMAP hbmp = CreateDIBSection(_hdc,bmpInfo,DIB_RGB_COLORS,NULL,NULL,0);
SetBitmapBits(hbmp,_bmi.biSizeImage,frame);
return hbmp;
}
О, и я использовал критическую секцию, потому что я передаю hbitmap элементу управления в свойстве, а затем обращаюсь к нему в OnPaint.Если это потенциальная проблема, мне придется переосмыслить это.Спасибо