如果显示属性是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);

}

解决方案 »

  1.   

    setdibtodevice 这个函数应该可以显示
      

  2.   

    如果图像放大显示setdibtodevice效率如何?我主要是做视频显示,效率要求比较高
      

  3.   

    最主要的问题是如何将内存中的象素转换成图片,我在转换成图片时SelectObject老是错误。好像32位的就可以
      

  4.   


        bmp.CreateBitmap(176, 144, 1, 32,rgb_buf);
    不是有个参数是选择是32位还是24位吗?为什么24位不可以32位可以?
      

  5.   

    选入DC的要与DC相兼容,BitBlt的两个DC也要兼容,所以24位的位图不能选入32位的DC,即使选入24位的DC,也贴不到32位的显示DC上。
    setdibtodevice试试,如果你不想转。
    现存的机器,一点点内存拷贝工作资源消耗可以忽略不计
      

  6.   

    //make HBITMAP
    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就可以显示了