zoukankan      html  css  js  c++  java
  • 简单的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);

  • 相关阅读:
    test
    flash链接需要后台调用时的插入flash方法
    js验证码倒计时
    设置Cookie
    用in判断input中的placeholder属性是否在这个对象里
    常用的正则表达式规则
    webApp添加到iOS桌面
    .substr()在字符串每个字母前面加上一个1
    PAT 甲级1001 A+B Format (20)(C++ -思路)
    PAT 1012 数字分类 (20)(代码+测试点)
  • 原文地址:https://www.cnblogs.com/d3inc/p/3799923.html
Copyright © 2011-2022 走看看