本帖最后由 didilc 于 2010-11-26 15:33:35 编辑

解决方案 »

  1.   

    另外再OnPaint()使用了BitbBit,代码如下:BitBlt(g_hDC,0,0,m_iW_imageOnScreen,m_iH_imageOnScreen,m_memDC_end,0,0,SRCCOPY);////////////////////////////////////////////////////////////////////////////////你有发送重绘消息没??
      

  2.   

    有的CPaintDC dc(this);
    BitBlt(g_hDC,0,0,m_iW_imageOnScreen,m_iH_imageOnScreen,m_memDC_end,0,0,SRCCOPY);
      

  3.   

    对于位图数据的写回,最好用SetDIBits将它写入到位图对象中去。
      

  4.   

    在修改了位图数据后要调用SetBitmapBits(HBITMAP hmbp, DWORD cBytes, CONST VOID (lpBits)才能有效。 
    在SelectObject(m_memDC, g_hBitmap); 之前添加SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits);
      

  5.   

    加入你的代码后还是黑图,详细代码如下,是否是我加得位置有问题,红色部分是我加入的void CArmetDlg::CreateBitmap()
    {
    if(g_hBitmap != NULL)  DeleteObject(g_hBitmap);
    CClientDC dc(GetDlgItem(IDC_VIEW_WND));
        g_hBitmap = ::CreateDIBSection(dc.m_hDC, m_lpbi, DIB_RGB_COLORS, (void **)&m_pBits, NULL, 0 ); if(IsContinue==TRUE)
    {
    for(int i=0;i<IMAGE_HEIGHT;++i)
    {
    memcpy(m_pBits + i * m_wLinePixel,
    m_pDataCon + (IMAGE_HEIGHT-i-1) * IMAGE_WIDTH,
    IMAGE_WIDTH);
    }
    }

    else
    {
    if(IsDieJia==TRUE)
    {
    for (int idx=0;idx<IMAGE_SIZE;idx++)
    {
    int temp1=m_pDataD1[idx];

    int temp2=m_pDataD2[idx];

    if (temp1<=temp2)
    {
    m_pDataD3[idx]=temp1;
    }
    else
    {
    m_pDataD3[idx]=temp2;
    }
      

    }
    for(int j =0; j<IMAGE_SIZE; j++)
    {
    temp11[j]=m_pDataD3[j];}
                              
    for(int i=0;i<IMAGE_HEIGHT;++i)
    {

    memcpy(m_pBits + i * m_wLinePixel,
    m_pDataD3 + (IMAGE_HEIGHT-i-1) * IMAGE_WIDTH,
    IMAGE_WIDTH); }

    }
    }
            SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits); SelectObject(m_memDC, g_hBitmap);
    }
      

  6.   

    是不是计算方式错误?你试验一下SRCAND
      

  7.   

    SetBitmapBits(g_hBitmap,IMAGE_WIDTH*IMAGE_HEIGHT,m_pBits); 
    =============
    这里的IMAGE_WIDTH*IMAGE_HEIGHT肯定不对,这里要求是缓冲区的长度,而数组的长度并不是图片的长乘以图片的宽,还要考虑每个像素的色深,例好32位色深的每一个像素占4个字节。
      

  8.   

    dibsection不是那么用的,不需要SetBitmapBits(),那个是DDB的, dibsection是dib的.你这个: m_lpbi 怎么构造的,帖来look look.
      

  9.   

    我是这么定义的,你看看对不对。 m_wLinePixel= WORD(WIDTHBYTES((DWORD)IMAGE_WIDTH * 8));

    m_lpbi = (LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD))];
    m_lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    m_lpbi->bmiHeader.biWidth = m_wLinePixel;
    m_lpbi->bmiHeader.biHeight = IMAGE_HEIGHT;
    m_lpbi->bmiHeader.biPlanes = 1;
    m_lpbi->bmiHeader.biBitCount = 8;
    m_lpbi->bmiHeader.biCompression = BI_RGB;
    m_lpbi->bmiHeader.biSizeImage = m_wLinePixel * IMAGE_HEIGHT;
    m_lpbi->bmiHeader.biXPelsPerMeter = 0;
    m_lpbi->bmiHeader.biYPelsPerMeter = 0;
    m_lpbi->bmiHeader.biClrUsed = 0;
    m_lpbi->bmiHeader.biClrImportant = 0;