内存dc和颜色遮罩的使用

绝对参考文章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);

	//显示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到另一个位图上,再通过颜色遮罩来处理显示。不过这样感觉不能一劳永逸。


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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值