zoukankan      html  css  js  c++  java
  • 简单的GDI+双缓冲的分析与实现

    原文链接: http://blog.csdn.net/clodfront/article/details/5488648

    为什么要使用双缓冲绘制

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

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

    那就是双缓冲.

     

    它的基本原理就是

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

     

    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);

  • 相关阅读:
    WPF Prefix 'attach' does not map to a namespace.
    C# 用ManulResetEvent 控制Thread的 Suspend、Resume
    C# 监控Windows睡眠与恢复
    c# DataTable to Object Mapping
    C# DispatcherTimer Start之后立即执行
    Visual studio 编译时copy文件、文件夹
    c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)
    EntityFramework 找不到方法:“Void System.Data.Entity.DbModelBuilder.RegisterEntityType
    wpf 全局异常捕获处理
    pandas入门
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4636218.html
Copyright © 2011-2022 走看看