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);
     
     
     
     
     
  • 相关阅读:
    3、总结
    三分及小例题
    约瑟夫问题的推导
    对于联通块的处理
    扩展欧几里得与二元不定方程
    js 阻止事件捕获
    原生xhr发送JSON
    $timeout
    Angularjs Ng_repeat中实现复选框选中并显示不同的样式
    为什么用Object.prototype.toString.call(obj)检测对象类型?
  • 原文地址:https://www.cnblogs.com/chenzuoyou/p/3298000.html
Copyright © 2011-2022 走看看