zoukankan      html  css  js  c++  java
  • GDI+ 双缓冲实现

    早前曾为此问题在CSDN发帖求助(GDI+ 如何使用双缓冲绘制图像),得到了一个GDI+下较可行的方法,虽然绘制效果比直接绘制要好一些,不过还不能跟GDI的双缓冲方式比肩。
     
    现在,我终于找到了一个理想的实现方式,效果与GDI的实现不相上下,代码如下:
     
    /*C++ code*/
    RECT rc;
    GetClientRect(g_hwnd,&rc);
    Bitmap bmp(int(rc.right),int(rc.bottom));
     
    Graphics bmpGraphics(&bmp);
    bmpGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
     
    /*Drawing on bitmap*/
    SolidBrush bkBrush(Color(0,0,0));
    bmpGraphics.FillRectangle(&bkBrush,0,0,rc.right,rc.bottom);
     
    /*Drawing on DC*/
    Graphics graphics(hdc);
    /*Important! Create a CacheBitmap object for quick drawing*/
    CachedBitmap cachedBmp(&bmp,&graphics);
    graphics.DrawCachedBitmap(&cachedBmp,0,0);
     
    以上的绘制代码最区别于网络上其他GDI+实现的一处就是,在最后添加了一个CacheBitmap对象用于快速绘制。
     
    CacheBitmap是一个包含了bmp全部象素,并且针对graphics所关联的DC做过特别优化的位图对象。这点可以从其构造参数上看到。 
     
    关于双缓冲的实现还有一点十分关键,虽然它不属于双缓冲实现的核心。如果绘制需要经常的重绘背景,则需要自己拦截WM_ERASEBKGND消息,并在处理函数中什么也不做,即此消息发生时不重画背景,背景的重画在WM_PAINT中全权控制。
     
    如,WM_ERASEBKGND消息处理的实现
    void OnEraseBkGnd(HDC hdc)
    {
    //do nothing
    }
     
     
    附:GDI的双缓冲实现
    RECT rc;
    GetClientRect(hwnd,&rc);
    HDC hMemDc = CreateCompatibleDC(hdc);
    HBITMAP hBmp = CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
    HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc,hBmp);
    //在此使用hMemDc进行 GDI 绘制
    BitBlt(hdc,0,0,rc.right,rc.bottom,hMemDc,0,0,SRCCOPY);
    SelectObject(hMemDc,hOldBmp);
    DeleteObject(hBmp);
    DeleteObject(hMemDc);
     
     
     
     
     
  • 相关阅读:
    C#for循环——迭代法、穷举法
    C#循环语句
    C#算数运算符、关系运算符、逻辑运算符、语句
    C#visual2012基本操作、数据类型、类型转换
    C#进制转化
    Ajax用法
    《四》JAVA 字符输入输出流
    《三》Java IO 字节输入输出流
    《二》Java IO 流的分类介绍
    《一》File 类的介绍
  • 原文地址:https://www.cnblogs.com/chenzuoyou/p/3298000.html
Copyright © 2011-2022 走看看