双缓存解决闪烁问题
原文链接:
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);
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 软件产品开发中常见的10个问题及处理方法
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 《HelloGitHub》第 108 期