参考:
http://www.myexception.cn/vc-mfc/124942.html
HBITMAP hBmp = (HBITMAP)LoadImage(NULL, csBmpFile, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
hBmp = BmpInversion(hBmp, pClientDC);
HBITMAP CBmpList::BmpInversion(HBITMAP hSrcBmp, CClientDC* pClientDC)
{
CBitmap btSRC;
btSRC.Attach(hSrcBmp);
CDC dcSrc;
CDC dcDest;
//分别创建对预显示位图的DC的兼容DC
dcSrc.CreateCompatibleDC(pClientDC);
dcDest.CreateCompatibleDC(pClientDC);
BITMAP bitmap;
btSRC.GetBitmap(&bitmap);
CBitmap btSingleColor;
//创建单色位图
btSingleColor.CreateBitmap(bitmap.bmWidth, bitmap.bmHeight, 1, 1, NULL);
//载入源位图
dcSrc.SelectObject(&btSRC);
//VC默认的背景色白色
//设置背景色,也就是源位图的透明色
dcSrc.SetBkColor(RGB(0,0,0));//如何才能知道一副图片的前景色和背景色…… by ralf
//载入单色位图
dcDest.SelectObject(&btSingleColor);
//这里DC之间的块数据拷贝就用到了开头提到的知识点,从彩色位图向单色位图转换,
//源位图的背景图拷到掩码DC中后变为白色,其他则为黑色
dcDest.BitBlt(0, 0, bitmap.bmWidth, bitmap.bmHeight, &dcSrc, 0, 0, SRCINVERT);
hSrcBmp = (HBITMAP)btSingleColor.Detach();
dcSrc.DeleteDC();
dcDest.DeleteDC();
btSRC.DeleteObject();
return hSrcBmp;
}