绝对参考文章http://blog.youkuaiyun.com/xiangsimoyinjiu/article/details/51001784,哇,博主说未经允许,不准转载。。。
原来是想做什么呢?是想独立创建一个图层,背景好比是白色,那我用红色作画,最后能略去白色,直接将绘图显示到下面图层(可见)。但是,失败了好像。但是学习到了一点颜色遮罩的使用。
先贴代码:
CDC *m_PrimaryMemDC =new CDC;m_PrimaryMemDC->CreateCompatibleDC(&dc);
CDC *m_TempMemDC = new CDC ;m_TempMemDC->CreateCompatibleDC(&dc);
CDC *m_dcMask = new CDC;m_dcMask->CreateCompatibleDC(&dc);
OnDraw:
m_PrimaryMemDC->SelectObject(m_bitmap1);//将之前已经装载好的一个位图选入内存dc
m_TempMemDC->SelectObject(m_bitmap2);
BITMAP bitmap1,bitmap2;
m_bitmap1->GetBitmap(&bitmap1);
//颜色遮罩层
CBitmap bmpMask;
bmpMask.CreateBitmap(100,100,1,1,NULL);
m_dcMask->SelectObject(&bmpMask);
m_TempMemDC->BitBlt(0,0,bitmap1.bmWidth,bitmap1.bmHeight,
m_PrimaryMemDC,0,0,SRCCOPY);
//显示bitmap1
pDC->BitBlt(0,0,bitmap1.bmWidth,bitmap1.bmHeight,
m_PrimaryMemDC,0,0,SRCCOPY);
//显示单色位图
pDC->BitBlt(200,10,100,100,//m_rect.Width(),m_rect.Height(),
m_dcMask,0,0,SRCCOPY);
m_TempMemDC->SetBkColor(RGB(255,0,0));
//这里将dc背景色设为红色,当将他copy到mask层的时候,
//使得mask层对于红色就变成白色,而其他颜色就是黑色
m_dcMask->BitBlt(0,0,100,100,m_TempMemDC,0,0,SRCCOPY);
//显示用
pDC->BitBlt(310,0,100,100,//m_rect.Width(),m_rect.Height(),
m_dcMask,0,0,SRCCOPY);
pDC->BitBlt(420,0,100,100,//m_rect.Width(),m_rect.Height(),
m_TempMemDC,0,0,SRCCOPY);
m_TempMemDC->SetBkColor(RGB(0,0,0));
m_TempMemDC->SetTextColor(RGB(255,255,255));
// pDC->BitBlt(0,210,100,100,m_TempMemDC,0,0,SRCCOPY);
m_TempMemDC->BitBlt(0,0,100,100,m_dcMask,0,0,SRCAND);
//在这里大胆的猜测:m_TempMem中被m_dcMask白色部分覆盖的应该与上背景色
//被黑色部分(透明部分覆盖的应该与上前景色)
//即m_TempMemDC中的红色区域被m_dcMask中的白色遮住的部分与上背景色成为黑色
//而被黑色遮住的部分与上前景色保留原来的颜色
//显示用
pDC->BitBlt(300,210,100,100,m_TempMemDC,0,0,SRCCOPY);
pDC->BitBlt(410,210,100,100,m_dcMask,0,0,SRCCOPY);
pDC->SetBkColor(RGB(255,255,255));
pDC->BitBlt(0,320,100,100,m_dcMask,0,0,SRCAND);
pDC->BitBlt(0,320,100,100,m_TempMemDC,0,0,SRCPAINT );
显示一下最终图片:
然后最后大胆感觉了一下,颜色遮罩还是只能对付一个图层,就好像字面的意思一样,遮住颜色。好比遮住红色,显示其他颜色,总得用一个颜色去替换被遮住的颜色。(猜的)
不过这样的话,也可以先将一个位图先copy到另一个位图上,再通过颜色遮罩来处理显示。不过这样感觉不能一劳永逸。
哈哈,菜鸟一枚,大神勿开喷