MFC 双缓冲 GDI+ Graphics 在图片上画图写字 避免闪烁

缘起:需要在MFC Static控件上显示持续变化的数据,控件背景为某种格式的背景图片的一部分。

之前已经试了双缓冲,确实是能够很好的避免闪烁。因为双缓冲需要用到兼容位图,但是又苦于不知道如何将图片的某一部分复制给该位图,恰巧又使用到Graphics::DrawImage(),其对于图片的截取操作是很方便的,,具体可以搜下。

那么如何做呢?

假如我的背景图片是bg.bmp/bg.png等等格式都可以

那么我可以

Image img1(L"bg.png");

//或者Bitmap img2(L"bg.bmp");

因为使用了双缓冲,则需要使用兼容DC,先在内存中画好需要的图片内容+文字,再复制到原始DC中,总得结果就是这样做速度快,可以避免了闪烁。

RectF destRC;destRC.X=0;destRC.Y=0;destRC.Width=rectW*2; //rectW rectH 只是随意写的宽度、长度,destRC.Height=rectH*2;Image img1(L"bg.png");//或者Bitmap img2(L"bg.bmp");CDC *pDC=GetDlgItem(IDC_VALUE)->GetDC();CDC memDC;memDC.CreateCompatibleDC(pDC);//建 兼容内存DCCBitmap bitmap,*oldBitmap;bitmap.CreateCompatibleBitmap(pDC,rectW*2,rectH*2);//建 兼容位图;rectW*2,rectH*2 这里一般与控件大小一样就可oldBitmap=memDC.SelectObject(&bitmap);//载入该位图Graphics graphic(memDC.GetSafeHdc());//通过控件句柄创建一个Graphics对象,则其后续操作可认为作用在bitmap上了。//也可以是 Graphics graphic(memDC.m_hDC);graphic.DrawImage(&img1,destRC,rectW,0,rectW*2,rectH*2,UnitPixel);//将需要的部分背景图片载入到bitmap上吧;img1可换为img2CFont *oldFont=memDC.SelectObject(m_font_Val);memDC.SetTextColor(RGB(255,0,0));memDC.SetBkMode(TRANSPARENT);//设置背景透明;若不设置,字所在区域背景是白色的,达不到透明的效果memDC.TextOutA(rectW*0.5,rectH*0.5,noiseValue);pDC->BitBlt(0,0,rectW*2,rectH*2,&memDC,0,0,SRCCOPY);//将内存DC内容输出到控件上memDC.SelectObject(oldFont);pDC->DeleteDC();memDC.DeleteDC();

效果如下:

这里的背景是一张渐变图片,可不是纯色的单纯背景啊!!

之前说的,如果memDC.SetBkMode(TRANSPARENT) 不设置的话,那么效果就变成

看吧,文字所在区域背景变成白色了,达不到需要的透明效果。

版权声明:本文为博主原创文章,未经博主允许不得转载。

愚公因此敢移山,矢志不渝是前行,握紧拳头勇登攀,

MFC 双缓冲 GDI+ Graphics 在图片上画图写字 避免闪烁

相关文章:

你感兴趣的文章:

标签云: