//Load a bmp file, change its color and display the changed bmp in view
//LoadImage GetDIBits SetDIBitsvoid CViewBmpView::OnDraw(CDC* pDC)
{//load bmp file:"c:\\temp\\test.bmp"
CViewBmpDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
HBITMAP hbmp=(HBITMAP)LoadImage(NULL,"c:\\temp\\test.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
CBitmap cbmp;
cbmp.Attach(hbmp);
BITMAP bmp;
cbmp.GetBitmap(&bmp);
cbmp.Detach();
UINT * pData = new UINT[bmp.bmWidth * bmp.bmHeight];
BITMAPINFO bmpInfo;
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = bmp.bmWidth;
    bmpInfo.bmiHeader.biHeight = -bmp.bmHeight;
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biCompression = BI_RGB;
    bmpInfo.bmiHeader.biBitCount = 32; GetDIBits(pDC->m_hDC,hbmp,0,bmp.bmHeight,pData,&bmpInfo,DIB_RGB_COLORS);
    UINT color, r, g, b;
    for(int i = 0; i < bmp.bmWidth * bmp.bmHeight; i ++)
    {
        color = pData[i];
        b = color << 8 >> 24;
        g = color << 16 >> 24;
        r = color << 24 >> 24;
//note that infact, the r is Blue, b = Red,
        r = 0;//mask the blue bits
        pData[i] = RGB(r, g, b);
    }
SetDIBits(pDC->m_hDC, hbmp,0, bmp.bmHeight, pData,&bmpInfo, DIB_RGB_COLORS);
CDC dcmem;
dcmem.CreateCompatibleDC(pDC);
HGDIOBJ hold=::SelectObject(dcmem.m_hDC,hbmp);
pDC->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcmem,0,0,SRCCOPY);
::SelectObject(dcmem.m_hDC,hold);
delete pData;
DeleteObject(hbmp);
}

解决方案 »

  1.   

    CView::OnDraw(CDC* pDC)
    {
    CBitmap bmp;
    bmp.LoadBitmap(...);CClientDC dc(this);
    dc.CreateCompatbileDC(pDC);
    dc.SelectObject(&bmp);
    pDC->BitBlt(0, 0, bmpWidth, bmpHeigh, &dc, 0, 0, SRCCOPY);
    return 1;
    }
      

  2.   

    to ma811
      如在这上面的基础上按下鼠标后,将一个小的位图再画在这个位图上,代码要怎么写,我将代码都放在OnDraw函数中可以,但要实现按下鼠标后再画却不行。在OnLButtonDown中代码是不是有一些要注意的地方,我再开一个新的贴子来给分。
      

  3.   

    CreateCompatbileDC是什么函数?
    自己写的??
      

  4.   

    /*感谢关注*/
    //Creamdog//在给我的留言中留下你的E-mail,并附上你的问题,我会给你详细讲解关于位图的处理方法。/*注意给分*/
      

  5.   

    这是CDC 下的成员函数,是建立一个内存设备描述表,也就是一个缓冲区。位图要先选进这个缓冲区,再用BitBlt从缓冲区写到屏幕上.
      

  6.   

    在执行CreateCompatbileDC时出现 ASSERT(m_hDC == NULL) 错误。
    怎么回事??
    请指教。谢谢