|
参考:
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; }
|