zoukankan      html  css  js  c++  java
  • 双缓存解决闪烁问题

    原文链接:

    https://www.cnblogs.com/owenlang/p/3916989.html

       static HDC      hdcBackBuffer;
        static HBITMAP  hBitmap;
        static HBITMAP  hOldBitmap;
    //创建后备缓冲器
    //1. 用 CreateCompatibleDC 创建一个内存设备,得到后备缓冲区的hdc;
                hdcBackBuffer = CreateCompatibleDC(NULL);
    //2. GetDC 取得前端客户区的hdc,然后用 CreateCompatibleBitmap 创建相容的位图,得到一个位图句柄;
                HDC hdc = GetDC(hwnd);
                hBitmap = CreateCompatibleBitmap(hdc, cxClient, cyClient);
    //3. 把上一步得到的位图句柄选入后备缓冲区的hdc,别忘了用 ReleaseDC 释放客户区的hdc;
                hOldBitmap = (HBITMAP)SelectObject(hdcBackBuffer, hBitmap);
                ReleaseDC(hwnd, hdc);


    //使用后备缓冲器(通常在onpaint中)
    //1. 清除后备缓冲,通常用背景色填充;
    //            int backColor;
    //            GetClassLong(hwnd, backColor);
                BitBlt(hdcBackBuffer, 0, 0, cxClient, cyClient, NULL, NULL, NULL, WHITENESS);
    //2. 在后备缓冲区的hdc中绘制,写字等;
                //选用新的画笔和画刷
                oldPen = (HPEN)SelectObject(hdcBackBuffer, bluePen);
                oldBrush = (HBRUSH)SelectObject(hdcBackBuffer, redBrush);
    ……………………………………………………………………………………
    //3. 用 BitBlt 将后备缓冲区中的内容复制到前台缓冲区;
                BitBlt(ps.hdc, 0, 0, cxClient, cyClient, hdcBackBuffer, 0, 0, SRCCOPY);
    
                EndPaint(hwnd, &ps);
                //必要的延时
                Sleep(10);




    //5. 为了确保后备缓冲区能随用户改变窗口尺寸大小而改变,必须在 WM_SIZE 消息中删除已有的兼容位图,并创建一个新的合适大小的位图;
                //把 old bitmap选回到DC
                SelectObject(hdcBackBuffer, hOldBitmap);
                //删除原先创建的bitmap,否则会资源泄露
                DeleteObject(hBitmap);
                HDC hdc = GetDC(hwnd);
                //创建和客户区有相同大小的另一个bitmap
                hBitmap = CreateCompatibleBitmap(hdc, cxClient, cyClient);
                ReleaseDC(hwnd, hdc);
                //把新的 bitmap 选入DC
                SelectObject(hdcBackBuffer, hBitmap);

    //4. 最后在程序结束时释放资源。
                SelectObject(hdcBackBuffer, hOldBitmap);
                DeleteObject(hdcBackBuffer);
                DeleteObject(hBitmap);





  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/14892495.html
Copyright © 2011-2022 走看看