其他分享
首页 > 其他分享> > 双缓存解决闪烁问题

双缓存解决闪烁问题

作者:互联网

原文链接:

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





标签:缓存,hwnd,后备,hdc,hBitmap,SelectObject,解决,hdcBackBuffer,闪烁
来源: https://www.cnblogs.com/ice-arrow/p/14892495.html