Здравствуйте, SlavaV, Вы писали:
SV>Здравствуйте, SV>Подскажите пожалуйста как создать CBitmap если имеется указатель на байтовый массив и структуру BITMAPINFO
char *cptrData;
char *cptrDIBData;
char *lpDIBData;
if( (cptrDIBData = (char *)malloc( sizeof( char ) * 256 * 360 )) == NULL )
MessageBox("cptrDIBData no mem", "Ошибка", MB_OK);
lpDIBData = cptrDIBData;
// rotate an image while copying data to the DIB data
cptrData = (char *)pDoc->m_DataPtr + (360 — 1) * 256;//pDoc->m_DataPtr указатель на массив данных со сканера
//Разворачиваем изображение
for( iCyc = 0; iCyc < 360; iCyc++ )
{
memcpy( cptrDIBData, cptrData, 256 );
cptrData = cptrData — 256;
cptrDIBData = cptrDIBData + 256;
}
::SelectPalette(hDC , hPGrayscale, false);
::RealizePalette(hDC);
::SetDIBitsToDevice(hDC, 40,40, 256, 360, 0, 0, 0, 360, lpDIBData, lpDIBHeader, DIB_RGB_COLORS);
::ReleaseDC(m_hWnd, hDC);
Это код всё нормально работает выводит изображение в основное окно, но не хочет печататься ошибку выдаёт.
и не хочет выводить изображение в диалоговое окно (при подстановке hDC диалога). Поэтому пришла идея преобразовать его в CBitmap и тут опять проблемы.
//Функция обработки события OnPaint в диалоговом окне
//------------------------------------------------------------------
//Создаём структуру BITMAPINFO
BITMAPINFO *lpDIBHeader = NULL;
HBITMAP hBM;
HDC hDC;
CDC DCMem;
if( (lpDIBHeader = (BITMAPINFO *)malloc( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 )) == NULL )
MessageBox("lpDIBHeader no mem", "Ошибка", MB_OK);
lpDIBHeader->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
lpDIBHeader->bmiHeader.biWidth = 256;
lpDIBHeader->bmiHeader.biHeight = 360;
lpDIBHeader->bmiHeader.biPlanes = 1;
lpDIBHeader->bmiHeader.biBitCount = 8;
lpDIBHeader->bmiHeader.biCompression = BI_RGB;
//Заполняем палитру
for( int iCyc = 0; iCyc < 256; iCyc++ )
{
lpDIBHeader->bmiColors[iCyc].rgbBlue = lpDIBHeader->bmiColors[iCyc].rgbGreen = lpDIBHeader->bmiColors[iCyc].rgbRed = (BYTE)iCyc;
}
hDC = ::CreateCompatibleDC(pDC->m_hDC);
hBM = ::CreateCompatibleBitmap(hDC, 256, 360);
::SetDIBits(hDC, hBM, 0, 360, m_DataPtr, lpDIBHeader, DIB_RGB_COLORS);//m_DataPtr указатель на массив данных со сканера
m_Bitmap = CBitmap::FromHandle(hBM);
DCMem.CreateCompatibleDC(pDC);
DCMem.SelectObject(m_Bitmap); pDC->BitBlt(10, 10, 256, 360, &DCMem, 0, 0, SRCCOPY);
Ни в какую не хочет работать