简单的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);

 

你可能感兴趣的