如果显示属性是32位,要转换成32位void CTest0Dlg::show(BYTE* pSrc)
{
unsigned char rgb_buf[176*144*4];
for(int i=0; i< 144; i++)
{
for(int j=0; j<176; j++)
{
memcpy(rgb_buf + i*176*4 + j*4, pSrc + i*176*3+j*3, 3);
rgb_buf[i*176*4 +j*4+3] = 0;
}
}
CDC *pdc = GetDC() ;
CDC memdc;
CBitmap bmp;
CRect rt;
CSize size;
memdc.CreateCompatibleDC(pdc);
srand(time(NULL));
bmp.CreateBitmap(176, 144, 1, 32,rgb_buf);
size.cx = 176;
size.cy = 144;
memdc.SelectObject(&bmp);
GetClientRect(&rt);
pdc->StretchBlt(rt.left, rt.top, rt.right, rt.bottom, &memdc, 0, 0, size.cx, size.cy, SRCCOPY);
// pdc->BitBlt(rt.left, rt.top, rt.right, rt.bottom, &memdc, 0, 0, SRCCOPY);
memdc.DeleteDC();
ReleaseDC(pdc);
}
{
unsigned char rgb_buf[176*144*4];
for(int i=0; i< 144; i++)
{
for(int j=0; j<176; j++)
{
memcpy(rgb_buf + i*176*4 + j*4, pSrc + i*176*3+j*3, 3);
rgb_buf[i*176*4 +j*4+3] = 0;
}
}
CDC *pdc = GetDC() ;
CDC memdc;
CBitmap bmp;
CRect rt;
CSize size;
memdc.CreateCompatibleDC(pdc);
srand(time(NULL));
bmp.CreateBitmap(176, 144, 1, 32,rgb_buf);
size.cx = 176;
size.cy = 144;
memdc.SelectObject(&bmp);
GetClientRect(&rt);
pdc->StretchBlt(rt.left, rt.top, rt.right, rt.bottom, &memdc, 0, 0, size.cx, size.cy, SRCCOPY);
// pdc->BitBlt(rt.left, rt.top, rt.right, rt.bottom, &memdc, 0, 0, SRCCOPY);
memdc.DeleteDC();
ReleaseDC(pdc);
}
bmp.CreateBitmap(176, 144, 1, 32,rgb_buf);
不是有个参数是选择是32位还是24位吗?为什么24位不可以32位可以?
setdibtodevice试试,如果你不想转。
现存的机器,一点点内存拷贝工作资源消耗可以忽略不计
BITMAPINFOHEADER bmih;
memset(&bmih,0,sizeof(BITMAPINFOHEADER));
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = nWidth;
bmih.biHeight = nHeight;
bmih.biPlanes = 1;
bmih.biBitCount = 24;
bmih.biCompression = BI_RGB;
BITMAPINFO bmi;
memset(&bmi,0,sizeof(BITMAPINFO));
bmi.bmiHeader = bmih;
HDC hDC = /*需要显示的目的dc*/;
HBITMAP hbit = CreateDIBitmap(hDC,&bmih,CBM_INIT,
dataPtr,&bmi,DIB_RGB_COLORS); 然后把 hbit 选入目的dc就可以显示了