简单的GDI+双缓冲的分析与实现

为什么要使用双缓冲绘制

在进行多图元绘制的时候:

因为是要一个一个画上去,所以每画一个图元,系统就要做一次图形的绘制操作,图形的重绘是很占用资源的,特别当需要重绘的图形数量很多的时候,所造成的消耗就特别大,导致闪烁,不流畅等情况。那么如何来解决这个问题呢?

那就是双缓冲.

 

它的基本原理就是

先在内存中开辟一块虚拟画布,然后将所有需要画的图元一个个先画在这块“虚拟画布”上,最后在一次性将整块“虚拟画布”画到真正的窗体上。因为所有的单个图形的绘制都不是真正的调用显示系统来“画”,所以不会占用显示系统的开销,极大的提高的绘图效率,避免闪烁,不流畅等现象。

 

GDI+实现双缓冲的具体步骤

IDE :  VC++/VS.NET C++

1.在内存中建立一块“虚拟画布”:

   //获取窗口客区宽高

    RECT r;

    GetClientRect(m_hWnd,&r);

    m_bufW=r.right; m_bufH=r.bottom;

   //在内存中建立一个Image的派生类Bitma对象做为"画布"

    Bitmap memBitmap(m_bufW,m_bufH);

2.获取这块内存画布的Graphics引用:

    Graphics  memGr(&memBitmap);

3.在这块内存画布上绘图:

   //这里可以通过memGr在memBitmap上绘制多个图元

   //我只举例绘制了一张图片

    Image* pimage=NULL;
    pimage=new Image(L"res//图片1.png");
    int w=pimage->GetWidth();

    int h=pimage->GetHeight();
    memGr.DrawImage(pimage,0,0,0,0,w,h,UnitPixel);
    delete pimage;

    pimage=NULL;

4、将内存画布画到窗口中

    m_hDC = GetDC(m_hWnd);

    Graphics gr(m_hDC);

    gr.DrawImage(&memBitmap,0,0);

    ReleaseDC(m_hWnd,m_hDC);

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值