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