内存dc和颜色遮罩的使用

来源:互联网 发布:我知谁掌管明天基督教 编辑:程序博客网 时间:2024/05/27 01:18

绝对参考文章http://blog.csdn.net/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);//显示bitmap1pDC->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到另一个位图上,再通过颜色遮罩来处理显示。不过这样感觉不能一劳永逸。


哈哈,菜鸟一枚,大神勿开喷


原创粉丝点击