//关键代码 CBitmap * BmpColorMaskOp(CBitmap &bmpSrc, COLORREF colorMask, DWORD dwOp) { //图像信息 BITMAP bmpInfo; bmpSrc.GetBitmap(&bmpInfo); int nWidth = bmpInfo.bmWidth; int nHeigth = bmpInfo.bmHeight; //创建DC设备 HDC hDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); CDC *pDC = CDC::FromHandle(hDC); //源DC设备 CDC scrDC; scrDC.CreateCompatibleDC(pDC); scrDC.SelectObject(&bmpSrc); //目标DC设备 CDC dstDC; dstDC.CreateCompatibleDC(pDC); CBitmap *bmpDst = new CBitmap; bmpDst->CreateBitmapIndirect(&bmpInfo); dstDC.SelectObject(bmpDst); //填充背景色 dstDC.FillSolidRect(CRect(0, 0, nWidth, nHeigth), colorMask); //按制定操作方式复制位图 dstDC.BitBlt(0, 0, nWidth, nHeigth, &scrDC, 0, 0, dwOp); //恢复和删除目标设备 dstDC.SelectObject( (CBitmap *)NULL); dstDC.DeleteDC(); //恢复和删除源设备 scrDC.SelectObject( (CBitmap *)NULL); scrDC.DeleteDC(); //删除hDC DeleteDC(hDC); return bmpDst; } //视图绘制部分代码 void CMDI1View::OnDraw(CDC* pDC) { CMDI1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CBitmap bmpSrc; bmpSrc.LoadBitmap(IDB_BITMAP1); CBitmap *bmpDst = BmpColorMaskOp(bmpSrc, pDoc->colorMask, pDoc->dwMaskOp); BITMAP bmpInfo; bmpSrc.GetBitmap(&bmpInfo); CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject(bmpDst); CRect rcClient; GetClientRect(rcClient); pDC->SetStretchBltMode(HALFTONE); pDC->StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY); memDC.SelectObject((CBitmap *)NULL); delete bmpDst; } //文档控制部分代码 // MDI1Doc.h : interface of the CMDI1Doc class class CMDI1Doc : public CDocument { // Attributes public: static int m_DocID; COLORREF colorMask; DWORD dwMaskOp; int CMDI1Doc::m_DocID = 0; BOOL CMDI1Doc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) CString szTitle = _T(""); colorMask = 0; dwMaskOp = SRCCOPY; switch(m_DocID) { case(1)://Red { colorMask = RGB(255, 0, 0); dwMaskOp = SRCAND; szTitle = _T("Red Channle"); break; } case(2)://Green { colorMask = RGB(0, 255, 0); dwMaskOp = SRCAND; szTitle = _T("Green Channle"); break; } case(3)://Blue { colorMask = RGB(0, 0, 255); dwMaskOp = SRCAND; szTitle = _T("Blue Channle"); break; } default: { dwMaskOp = SRCCOPY; szTitle = _T("RGB Channle"); } } m_DocID++; SetTitle(szTitle); return TRUE; } //效果