双缓冲(Double Buffer)原理和使用
.png)
- 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;
- }
- }
.png)
- void CGame2Dlg::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- CRect rect;
- GetClientRect(&rect);
- // 创建内存DC
- CDC memDC;
- memDC.CreateCompatibleDC(&dc);
- // 创建内存位图
- CBitmap bmp;
- bmp.CreateCompatibleBitmap(&memDC, rect.right - rect.left, rect.bottom - rect.top);
- // 将位图选入DC
- memDC.SelectObject(&bmp);
- // 绘图
- m_pGameEngine->Show(memDC.m_hDC);
- // 将后备缓冲区中的图形拷贝到前端缓冲区
- dc.BitBlt(0, 0, rect.right - rect.left, rect.bottom - rect.top, &memDC, 0, 0, SRCCOPY);
- }
- 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));
- gc = backBuffer.Graphics; // 获取缓冲区画布
- /* 像使用一般的 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());
- }
双缓冲(Double Buffer)原理和使用的更多相关文章
- 双缓冲(Double Buffer)原理和使用【转】
转自:http://blog.csdn.net/acs713/article/details/16359551 原文出自:http://blog.csdn.net/xiaohui_hubei/arti ...
- STM32的bulk双缓冲传输速度的讨论,硬件的坑永远填不完
详情:http://bbs.21ic.com/forum.php?mod=viewthread&tid=109584 USB 1.0的最高12Mbps. USB 2.0的高速模式480Mb ...
- GDI双缓冲绘图
一.简介 在进行复杂图形绘制时,若直接在屏幕DC上进行绘制,则会出现明显的闪烁.闪烁产生的原因是当绘制的图形较为 复杂时,图形绘制过程中就被刷新到屏幕上,导致结果断断续续地显示出来.双缓冲绘图的原理是 ...
- 双缓冲技术(Double Buffering)(1、简介和源代码部分)
这一节实在是有些长,翻译完后统计了一下,快到2w字了.考虑到阅读的方便和网络的速度,打算把这节分为5个部分,第一部分为双缓冲技术的一个 简介和所有的代码,如果能够看懂代码,不用看译文也就可以了.第二部 ...
- Win32双缓冲画图原理
网上有许多文章讲述了如何使用Visual C++程序实现双缓冲,都是用C++面向对象语言写的,可能对很多没有接触过面向对象语言的C语言初学者来说理解起来有些困难,并且有些好心人也只是把源代码贴上去,不 ...
- win32下的双缓冲绘图技术
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...
- VC使用双缓冲制作绘图控件
最近用VC做了一个画图的控件.控件在使用的时候遇到点问题.在控件里画了图之后切换到其他页面,等再切换回来的时候,发现控件里画的图都不见了.这是因为VC里面,当缩小.遮挡页面后客户区域就会失效,当再次显 ...
- c# GDI画图 双缓冲画图分析
双缓冲绘图分析 1.Windows 绘图原理 我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是“画”出来的.这时的屏幕,就相当于一块黑板,而 Windows ...
- 双缓冲类里的OnPaint与OnSize,以及构造函数的关系
代码摘自wx\lib\agw\knobctrl.py一点体会是,OnSize作为class的函数,被放在构造函数里执行,会先于OnPaint执行.测试结果是,初始启动后,会执行8次OnSize(为什么 ...
随机推荐
- Linux下root密码忘记的解决办法
{启动方式} ========================================================================== 一. lilo 1. 在出现 lil ...
- INSTALLING QUARTUS II V.13.1 64 BIT ON RHEL/CENTOS 6 64 BIT
http://www.digitalsolutionslab.com/installing-quartus-ii-v-13-1-64-bit-on-rhelcentos-6-64-bit/ I hav ...
- 理解JavaScript原型式继承
0.基础 javascript没有类的概念, javascript不需要实例化某个具体类的实例.javascript对象本身可以用来创建对象, 而对象可以继承自其他对象, 这个概念称为原型式继承 每个 ...
- spark1.1.0下使用SparkSQL
spark1.1.0的安装参见http://blog.csdn.net/bluejoe2000/article/details/41391407 安装了spark之后,可以在 shell中执行Spar ...
- 使用greenDao出现Property 'status' is not part of ********.NewCommentDao@717de9a
应为版本号的原因造成的,升级Schema版本号即可
- 全局负载均衡GSLB之“部署篇”
http://virtualadc.blog.51cto.com/3027116/875622 前言 随着web应用的不断发展,客户对于业务的稳定性.可靠性等也提出更高的要求,已不再局限于IDC内部的 ...
- SQL Server(基本) 关键字的使用 一
一, 基础关键字 -- 使用介绍 1,select 的使用(select 结果集) SELECT 列名称 FROM 表名称 以及: (*)是选取所有列的快捷方式. SELECT * FROM 表名称 ...
- Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel
Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只 ...
- TLF相关资料
1\(转)http://blog.csdn.net/hu36978/article/details/5796165 TFL 一般先创建TextFlow 通过控制flowComposer属性来控制文本 ...
- Struts1运行原理以及整合步骤
Struts1 struts1运行步骤 1.项目初始化:项目启动时加载web.xml,struts1的总控制器ActionServlet是一个Servlet,它在web.xml中是配置成自动启动的S ...
