双缓冲(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(为什么 ...
随机推荐
- Java 线程的状态
Java Thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...
- Java简单算法--出圈问题
package cn.magicdu.algorithm; import java.util.LinkedList; import java.util.List; /** * 出圈问题,数到某个数字的 ...
- 【原创】java 流星划过天空
import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.s ...
- C#拓展练习之模拟键盘录入
摘自<31天学会CRM项目开发<C#编程入门级项目实战>> 使用C#调用Windows API使程序模拟键盘输入,也可模拟按下快捷键.本例中,单击“模拟输入”按钮,可录入字符“ ...
- print neatly 整齐打印 算法导论
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098562.html 题目链接:print neatly 整齐打印 算法导论 考虑在一个打印 ...
- mysql---多表关联
首先要介绍一下集合的概念:集合具有无序性.唯一性. 无序性:指集合内部元素没有相对顺序的概念,对于两个集合而言,只要元素值和元素个数相同则两个集合相等. 唯一性:指集合内部元素不存在值相等的元素. 上 ...
- 排序算法SIX:冒泡排序BubbleSort
/** *冒泡排序: * 两个两个比较,一轮过后最大的排在了最后面 * n个数变为n-1个没排好的数 * 再进行一轮 * 第二大的排在了倒数第二个 * 以此类推 * 直到排到第一个为止 * * 弄两个 ...
- 【转】C#.net拖拽实现获得文件路径
C#.net拖拽实现获得文件路径 作者Attilax , EMAIL:1466519819@qq.com 思路: 通过DragEnter事件获得被拖入窗口的“信息”(可以是若干文件,一些文字等等), ...
- 把DataSet转换成JSON
/// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...
- PHP中进制之间的互相转换
常见的进制: 二进制 binary -----> bin 八进制 octal -----> oct 十进制 decimal -----> dec 十六进 ...
