GDI+图像处理学习笔记――改变图像的透明度(三)

2014-11-24 12:17:29 · 作者: · 浏览: 5
,RGB(255,255,255));
Graphics graph(memDC.GetSafeHdc());
//Graphics graph(pDC->GetSafeHdc());//获得当前设备的句柄
// graph.DrawImage(pDoc->image,0,0);
graph.DrawImage(&bitmap,0,0);
pDC->BitBlt(0,0,nWidth,nHight,&memDC,0,0,SRCCOPY);

// TODO: 在此处为本机数据添加绘制代码
//获得图像的宽度和高度
int nWidth=pDoc->image->GetWidth();
int nHight=pDoc->image->GetHeight();
//声明空白图像
Bitmap bitmap(nWidth,nHight);
Rect rect(0,0,nWidth,nHight);

Graphics temp(&bitmap);//对新图像进行绘制

ColorMatrix colorMartrix={
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,alpha,0,
0,0,0,0,1};
ImageAttributes imageAttr;
imageAttr.SetColorMatrix(&colorMartrix);
temp.DrawImage(pDoc->image,rect,0,0,nWidth,nHight,UnitPixel,&imageAttr);

//创建于设备兼容的内存环境
CDC memDC;
CBitmap MemBitmap;
CRect ClientRect;
GetClientRect(ClientRect);
memDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,ClientRect.Width(),ClientRect.Height());
memDC.SelectObject(MemBitmap);
memDC.FillSolidRect(0,0,ClientRect.Width(),ClientRect.Height(),RGB(255,255,255));
Graphics graph(memDC.GetSafeHdc());
//Graphics graph(pDC->GetSafeHdc());//获得当前设备的句柄
// graph.DrawImage(pDoc->image,0,0);
graph.DrawImage(&bitmap,0,0);
pDC->BitBlt(0,0,nWidth,nHight,&memDC,0,0,SRCCOPY);

// TODO: 在此处为本机数据添加绘制代码
} 这里面用了两种绘图方式,一种是直接向当前设备上下文输出图像,代码中注释部分。另一种是先创建与设备相兼容的内存环境,将图片先绘制在此内存环境中再拷贝到屏幕,之所以采用此种方法是因为这样可以去除视图在不断刷新过程中带来的屏幕闪烁,可是本人实际的运行效果,在不断移动滑块的时候,视图刷新依然有很明显的闪烁,本人也添加了视图类中的WM_ERASEBKGN消息,如下,但是依然不能解决其闪烁问题。


[cpp] BOOL CGdiPlus_ColorView::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//return TRUE;
return CView::OnEraseBkgnd(pDC);
}

摘自 txg703003659的专栏