VC双缓冲绘图小记

在VC下绘图,在放大缩小的时候会引起重绘(废话),但是最近用VC读了一幅图片文件,在我变动窗口大小的时候,视图区域一直闪烁。为了解决这个问题,学了一下双缓冲绘图。

双缓冲绘图的原理不难理解,就是先把图绘制在内存里,然后把整个内存的图像直接复制到视图区域即可。

步骤一屏蔽背景刷新。

背景刷新其实是在响应WM_ERASEBKGND消息。我们在
视类中添加对这个消息的响应,可以看到缺省的代码如下:
BOOL CMYView::OnEraseBkgnd(CDC* pDC)
{
//return CView::OnEraseBkgnd(pDC);
return TRUE;
}

步骤二缓冲绘图

//---------测试双缓存---------
		CDC dcMem; //用于缓冲作图的内存DC 

		CBitmap bmp; //内存中承载临时图象的位图 

		dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC 

		bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 

		dcMem.SelectObject(&bmp); //将位图选择进内存DC 

		//按原来背景填充客户区,不然会是黑色 

		dcMem.FillSolidRect(rect,pDC->GetBkColor()); 

		pPicture->Render(dcMem.m_hDC,0,0,rect.Width(),rect.Height(), 
			0,nHeight,nWidth,-nHeight,NULL);

		pDC->BitBlt(0,0,rect.Width(),rect.Height(), 

			&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台 

		dcMem.DeleteDC(); //删除DC

		//---------end测试------------

通过上面的方法大体可以实现双缓冲的绘图,不过如果一幅图过大的话(比如我读取了一个4M的jpg图片),在变动窗口大小的时候会出现卡的现象,也就是有点假死的感觉。如果各位看官有什么好方法,请留言告知一声,谢谢。

 标签: VC, 双缓冲

作者  :  sailor

仅仅看明白了还不够,能把别人给讲明白了才算及格。


  1. MurphyL
    1#
    MurphyL

    要不要在专业点啊~

    October 28th, 2011 at 07:42 pm 回复
      1. sailor
        sailor

        估计就这样了,专业不了了

        October 31st, 2011 at 12:12 am 回复
  2. 搁浅
    2#
    搁浅

    看不懂 啊,哈哈

    October 28th, 2011 at 07:59 pm 回复
      1. sailor
        sailor

        哈哈,这个是我们苦逼的专业而已~

        October 31st, 2011 at 12:12 am 回复
  3. 哈哈 不错不错





    没看懂····

    October 28th, 2011 at 09:38 pm 回复
      1. sailor
        sailor

        嗯,这个如果不学c++的话,就路过就行

        October 31st, 2011 at 12:13 am 回复
  4. walfred
    4#
    walfred

    这个还是蛮重要的,我现在就遇到了这些

    October 28th, 2011 at 11:14 pm 回复
      1. sailor
        sailor

        嗯,不过感觉这个方法还有问题

        October 31st, 2011 at 12:13 am 回复
  5. C瓜哥
    5#
    C瓜哥

    高版本的VC里面有CMemDC, 直接用,就可以忽略双缓冲的细节了[face:daxiao]

    October 29th, 2011 at 05:38 pm 回复
      1. sailor
        sailor

        嗯,谢谢啦,又写了一篇

        October 31st, 2011 at 12:14 am 回复
  6. 刚刚开始学习C,飘过..........

    October 29th, 2011 at 05:47 pm 回复
      1. sailor
        sailor

        你们不会也学C++吧

        October 31st, 2011 at 12:14 am 回复
          1. 现在还在学C,C++应该也是必修的吧。

            October 31st, 2011 at 09:01 am 回复
              1. sailor
                sailor

                看来你也要学c++了,不过感觉c和c++没有太大区别

                November 30th, 2011 at 02:38 pm 回复
  7. 梦飞
    7#
    梦飞

    [face:han]压力好大……看不懂……

    November 11th, 2011 at 07:54 pm 回复
      1. sailor
        sailor

        闻道有先后,术业有专攻

        November 30th, 2011 at 02:38 pm 回复
  8. 七七
    8#
    七七

    看不懂,好专业啊

    January 31st, 2012 at 10:55 am 回复
      1. sailor
        sailor

        用时自然会懂~

        February 22nd, 2012 at 05:35 pm 回复
  9. Kala
    9#
    Kala

    学习了,谢谢分享

    October 17th, 2012 at 10:22 am 回复


最新文章