双缓冲(Double Buffer)原理和使用【转】
转自:http://blog.csdn.net/acs713/article/details/16359551
原文出自:http://blog.csdn.net/xiaohui_hubei/article/details/16319249
一、双缓冲作用
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HDC hDC, hDCMem;
- HBITMAP hBmpMem, hPreBmp;
- switch (message)
- {
- case WM_PAINT:
- hDC = BeginPaint(hWnd, &ps);
- /* 创建双缓冲区 */
- // 创建与当前DC兼容的内存DC
- hDCMem = CreateCompatibleDC(hDC);
- // 创建一块指定大小的位图
- hBmpMem = CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
- // 将该位图选入到内存DC中,默认是全黑色的
- hPreBmp = SelectObject(hDCMem, hMemBmp);
- /* 在双缓冲中绘图 */
- // 加载背景位图
- hBkBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
- hBrush = CreatePatternBrush(hBkBmp);
- GetClientRect(hWnd, &rect);
- FillRect(hDCMem, &rect, hBrush);
- DeleteObject(hBrush);
- /* 将双缓冲区图像复制到显示缓冲区 */
- BitBlt(hDC, 0, 0, rect.right, rect.bottom, hDCMem, 0, 0, SRCCOPY);
- /* 释放资源 */
- SelectObject(hDCMem, hPreBmp);
- DeleteObject(hMemBmp);
- DeleteDC(hDCMem);
- EndPaint(hWnd, &ps);
- break;
- }
- }
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HDC hDC, hDCMem;
- HBITMAP hBmpMem, hPreBmp;
- switch (message)
- {
- case WM_PAINT:
- hDC = BeginPaint(hWnd, &ps);
- /* 创建双缓冲区 */
- // 创建与当前DC兼容的内存DC
- hDCMem = CreateCompatibleDC(hDC);
- // 创建一块指定大小的位图
- hBmpMem = CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
- // 将该位图选入到内存DC中,默认是全黑色的
- hPreBmp = SelectObject(hDCMem, hMemBmp);
- /* 在双缓冲中绘图 */
- // 加载背景位图
- hBkBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
- hBrush = CreatePatternBrush(hBkBmp);
- GetClientRect(hWnd, &rect);
- FillRect(hDCMem, &rect, hBrush);
- DeleteObject(hBrush);
- /* 将双缓冲区图像复制到显示缓冲区 */
- BitBlt(hDC, 0, 0, rect.right, rect.bottom, hDCMem, 0, 0, SRCCOPY);
- /* 释放资源 */
- SelectObject(hDCMem, hPreBmp);
- DeleteObject(hMemBmp);
- DeleteDC(hDCMem);
- EndPaint(hWnd, &ps);
- break;
- }
- }
- public void Show(System.Windows.Forms.Control control)
- {
- Graphics gc = control.CreateGraphics();
- // 创建缓冲图形上下文 (类似 Win32 中的CreateCompatibleDC)
- BufferedGraphicsContext dc = new BufferedGraphicsContext();
- // 创建指定大小缓冲区 (类似 Win32 中的 CreateCompatibleBitmap)
- BufferedGraphics backBuffer = dc.Allocate(gc, new Rectangle(new Point(0, 0), control.Size));
- /* 像使用一般的 Graphics 一样绘图 */
- Pen pen = new Pen(Color.Gray);
- foreach (Step s in m_steps)
- {
- gc.DrawLine(pen, s.Start, s.End);
- }
- // 将双缓冲区中的图形渲染到指定画布上 (类似 Win32 中的)BitBlt
- backBuffer.Render(control.CreateGraphics());
- }
- public void Show(System.Windows.Forms.Control control)
- {
- Graphics gc = control.CreateGraphics();
- // 创建缓冲图形上下文 (类似 Win32 中的CreateCompatibleDC)
- BufferedGraphicsContext dc = new BufferedGraphicsContext();
- // 创建指定大小缓冲区 (类似 Win32 中的 CreateCompatibleBitmap)
- BufferedGraphics backBuffer = dc.Allocate(gc, new Rectangle(new Point(0, 0), control.Size));
- /* 像使用一般的 Graphics 一样绘图 */
- Pen pen = new Pen(Color.Gray);
- foreach (Step s in m_steps)
- {
- gc.DrawLine(pen, s.Start, s.End);
- }
- // 将双缓冲区中的图形渲染到指定画布上 (类似 Win32 中的)BitBlt
- backBuffer.Render(control.CreateGraphics());
- }
转载于:https://www.cnblogs.com/sky-heaven/p/6971938.html
双缓冲(Double Buffer)原理和使用【转】相关推荐
- 双缓冲技术绘图原理及简单的VC实现
为了增加自己对双缓冲绘图技术的理解,简要做个笔记(以Windows为例): 1.Windows 绘图原理 我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是&qu ...
- 基于VC6.0的控制台作图--动画和双缓冲技术
文章目录 让图形动起来 直接向屏幕作图 使用双缓冲技术 双缓冲技术编程原理 让图形动起来 让图形动起来的办法就是不断定时清屏.重绘.像放电影那样.然而,直接向屏幕绘图是耗时的,在屏幕上画很多线,将多次 ...
- 【学习总结】MFC(CImagelist)(重绘)(双缓冲)
双缓冲实现按钮列表 本文通过介绍双缓冲与CImageList,重写CButton类,来实现按钮列表. 简单的效果图 双缓冲实现 双缓冲的技术原理: 在Windows中每一种设备都在内存中有一个设备描述 ...
- 双缓冲(double buffering)的原理和使用
最近在使用C#做项目的时候发现在加载一个具有大量控件和复杂背景图形的窗口时,会出现很影响视觉体验的频闪问题.最后发现使用双缓冲能很好的解决这个问题.下面就介绍一下双缓冲的原理及使用. 一.双缓冲作用 ...
- Ping Pong Buffer 双缓冲 C++代码学习
1.Ping Pong Buffer 原理分析 基本原理如上图所示,当设备有数据来时,先放入缓冲区1 然后将缓冲区1的数据放入缓冲区2,这时缓冲区1可接收下次数据.工作区可从缓冲区2拿数据 2.C++ ...
- mysql双写缓冲_MYSQL-写缓冲(change buffer)
(1)MySQL数据存储包含内存与磁盘两个部分: (2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page): (3)InnoDB以变 ...
- Qt的双缓冲技术(double buffering)
Qt的双缓冲技术(double buffering)是Qt绘画机制的一部分,是一种在Qt4中被全面采用的技术.其核心是:把一个窗口部件渲染到一个脱屏pixmap(off- screen pixmap) ...
- 多线程异步日志系统,高效、强悍的实现方式-双缓冲
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 目录 文章目录 单片机中常用的环形缓冲区 多线程异步日志:双缓冲机制 双缓冲机制为什么高效 尽可能的降低 Lock 的时 ...
- STM32F407学习之DMA双缓冲模式HAL库实现
本学期第一次培训要求用单片机实现1到40KHz的单步进变频正弦波输出,本菜鸡一开始用了通过修改定时器预分频系数和自动重装载值改变输出波表频率.修改定时器 + DDS两种方法,但实现的效果不太理想,不仅 ...
最新文章
- JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金)
- python【蓝桥杯vip练习题库】ADV-234字符串跳步
- 使用FastJson解析时有关内部类的两个问题
- Message popover
- 在UltraEdit的查找和替换中使用正则表达式 (转)
- 云测试软件详解,软件测试之登录测试详解
- Python爬虫项目---批量下载深圳证券信息
- matlab学习笔记第七章——常微分方程(ODE)的数值解
- electron实践(2)
- 关于u8, u16, u32, u64
- paip.chrome使用ACTIVX 的总结
- 设备发现协议SSDP实现
- Linux驱动认知简明导论③ —— 修改树莓派引脚文件pin4Driver.c操作IO口
- jink remote server(远程调试)
- 树莓派外接显示器黑屏_树莓派4B连接显示器黑屏或者提示input not supported
- 支配树与Lengauer-Tarjan算法
- 乡愁 - 怀念老者余光中
- 基于Python实现的简易微信系统
- RTU、FTU、DTU、TTU都是什么鬼?
- 【DB笔试面试755】在Oracle的DG中,RFS、LNSn、MRP、LSP进程的作用分别是什么?
热门文章
- SQL SERVER 2008筛选时报错 无法为该请求检索数据
- 转 天才学生的天才回答
- 用 document.readyState == complete 判断页面是否加载完成。
- Mybatis Plus简介_代码_以及文档地址_以及前置知识---Mybatis Plus工作笔记001
- Spring Security OAuth2.0_实现分布式认证授权_搭建网关工程_Spring Security OAuth2.0认证授权---springcloud工作笔记151
- Sentinel服务熔断配置fallback和blockHandler_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0052
- Sentinel热点Key降级上_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0042
- STM32工作笔记0025---理解并联电阻分流
- 关于bn层的进一步认识
- 杭电5253连接的管道